Округление printf для двойных значений

Кто-нибудь может объяснить такое поведение? Я хорошо знаком с представлением чисел с плавающей запятой на уровне машины -. Кажется, это связано с 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

Обратите внимание, первое число округляется в меньшую сторону, а второе — в большую.

15
задан user443854 27 April 2012 в 20:10
поделиться