16

誰かがこの動作を説明できますか? 私は、浮動小数点数のマシンレベルの表現をよく知っています。これは、printf とその形式に関連しているようです。どちらの数値も浮動小数点表記で正確に表されます (チェック: 64 を掛けると整数になります)。

#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 番目の数値は切り上げられることに注意してください。

4

2 に答える 2

20

それは「半分から偶数への丸め」または「バンカーの丸め」です。丸め表現の最後の桁は、数値が 2 つの数値のちょうど中間にある場合でも選択されます。

http://linuxgazette.net/144/misc/lg/a_question_of_rounding_in_issue_143.html :
「GNU C ライブラリの場合、printf() で使用される丸め規則は、「バンカーの丸め」または「偶数への丸め」です。 C99 仕様では、10 進数への変換には現在選択されている IEEE 丸めモード (デフォルトのバンカー丸め) を使用する必要があると記載されているため、他のいくつかの C ライブラリ。"

于 2012-04-27T20:15:09.773 に答える
0

%9.5f出力は、ソース番号に最も近い小数点以下 5 桁の数値を示します。

于 2012-04-27T20:15:01.757 に答える