zachowanie zaokrąglania printf dla gry podwójnej

Czy ktoś może wyjaśnić to zachowanie? Doskonale zdaję sobie sprawę z reprezentacji liczb zmiennoprzecinkowych na poziomie maszyny. Wydaje się, że jest to związane z printf i jego formatami. Obie liczby są reprezentowane dokładnie przez notację zmiennoprzecinkową (sprawdź: mnożenie przez 64 daje liczbę całkowitą).

<code>#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);
}
</code>

Wydajność:

<code>> 108.765625000000000000000000000000
> 108.76562
> 6961.000000000000000000000000000000
> 108.046875000000000000000000000000
> 108.04688
> 6915.000000000000000000000000000000
</code>

Zauważ, że pierwsza liczba zostaje zaokrąglona w dół, a druga zostaje zaokrąglona w górę.

questionAnswers(2)

yourAnswerToTheQuestion