Вопрос по c++, c – поведение округления printf для двойников

15

Кто-нибудь может объяснить это поведение? Я хорошо осведомлен о машинном представлении чисел с плавающей запятой. Похоже, это связано с printf и его форматами. Оба числа представлены в точности записью с плавающей точкой (проверка: умножение на 64 дает целое число).

<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>

Выход

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

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

Похоже, что Microsoft изменила свое поведение округления по умолчанию между VS 2010 и VS2015. Я просто обновился с одного на другой и получил несколько очень раздражающих и тонких ошибок. Этот блог, вероятно, предназначен для того, чтобы подчеркнуть изменения, но вы были бы прощены за полное их отсутствие. omatai
Тебе может быть интересна моя статья Exploringbinary.com / ... Некоторые реализации используют «округление до половины от нуля» вместо «округление до половины Rick Regan

Ваш Ответ

2   ответа
18

округленного представления выбирается равной, даже если число точно посередине между ними.

http: //linuxgazette.net/144/misc/lg/a_question_of_rounding_in_issue_143.htm:
"Для библиотеки GNU C правило округления, используемое printf (), это" округление банкиров "или" округление до четного ". Это более правильно, чем в некоторых других библиотеках C, так как в спецификации C99 говорится, что при преобразовании в десятичное число следует использовать текущий выбранный режим округления IEEE (округление по умолчанию банкиров). "

Автор связанной статьи некомпетентен. «Двоичное и десятичное основание не разделяют один и тот же набор иррациональных чисел» - это чепуха. Рациональность / нерациональность не зависит от базы. R..
@ R .. Действительно. Но процитированный отрывок статьи правильный, так как автор мучительно узнал в своемотчет об ошибк. Daniel Fischer
0

%9.5f output дает число с 5 цифрами после десятичной точки, которое является ближайшим к исходному номеру.

Похожие вопросы