誰かがこの動作を説明できますか?私は浮動小数点数の機械レベルの表現をよく知っています。これはprintfとそのフォーマットに関係しているようです。 両方の数値は、浮動小数点表記で正確に表されます(チェック:64を掛けると整数になります)。倍精度のprintf丸め動作
#include <stdio.h>
#include <iostream>
using namespace std;
int main() {
double x1=108.765625;
printf("%34.30f\n", x1);
printf("%9.5f\n", x1);
printf("%34.30f\n", x1*64);
double x2=108.046875;
printf("%34.30lf\n", x2);
printf("%9.5f\n", x2);
printf("%34.30f\n", x2*64);
}
出力:
> 108.765625000000000000000000000000
> 108.76562
> 6961.000000000000000000000000000000
> 108.046875000000000000000000000000
> 108.04688
> 6915.000000000000000000000000000000
メモ、最初の数は切り捨て取得し、2つ目は切り上げます。
私の記事http://www.exploringbinary.com/inconsistent-rounding-of-printed-floating-point-numbers/に興味があります。いくつかの実装では、「半減」の代わりに「ゼロからの半減」を使用します。 –
MicrosoftはVS 2010とVS2015の間でデフォルトの丸め動作を変更したようです。私はちょうど1つから他にアップグレードし、いくつかの非常に迷惑と微妙なバグを持っています。 [このブログ](https://blogs.msdn.microsoft.com/vcblog/2014/06/18/c-runtime-crt-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1 /)はおそらく変更を強調することを意図していますが、あなたはそれを完全に逃したことを許されます。 – omatai
それは実装に依存します。[sprintfのWindowsベースのシステムとUNIXベースのシステムの丸めの違い](http://stackoverflow.com/q/4649554/995714)、[C++ sprintfとの結びつきの丸め動作の整合性](http:// stackoverflow。 com/q/31142600/995714) –