printfを素数の最初の桁に丸める方法は?

printfを素数の最初の桁に丸める方法は?

printf私のシステムではprintf (GNU coreutils) 8.26、とを使用して2つの異なる実装をテストしていますzsh 5.3.1。つまり、1.5、2.5、3.5、... 9.5がどのように丸められるかをテストしています。

$ for i in {1..9}; do /usr/bin/printf '%.0f\n' "${i}.5"; done
2
2
4
4
6
6
8
8
10
$ for i in {1..9}; do printf '%.0f\n' "${i}.5"; done
2
2
4
4
6
6
8
8
10

ここでは両方とも明確です。偶数に丸める。しかし、小数点の最初の桁まで丸めをテストすると、状況が混乱します。つまり、1.15、1.25、1.35、... 1.95をテストしています。

$ for i in {1..9}; do /usr/bin/printf '%.1f\n' "1.${i}5"; done
1.1
1.2
1.4
1.5
1.5
1.6
1.8
1.9
2.0
$ for i in {1..9}; do printf '%.1f\n' "1.${i}5"; done
1.1
1.2
1.4
1.4
1.6
1.6
1.8
1.9
1.9

どちらの実装も異なっており、どちらも明確なパターンを見ることができません。これらの2つはどのようにprintf小数点の最初の桁に丸められますか?

ベストアンサー1

GNU印刷機能使用long doubleそしてzsh一般的なdoublesを使用してください。丸め動作は、(例えば)1.45が2の累乗の和として表すことができないためです。IEEE 754浮動小数点表現有効で最も近い近似値は精度によって異なります。わずかに大きい(80ビット)、小さい(64ビット)、見てわかるように丸められ、または切り捨てられます。

いつものように、正確な人間レベルの表現と丸めに興味がある場合は、浮動小数点を使用しないでください。

おすすめ記事