Вопрос по c++, c – поведение округления printf для двойников
Кто-нибудь может объяснить это поведение? Я хорошо осведомлен о машинном представлении чисел с плавающей запятой. Похоже, это связано с 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>
Обратите внимание, первое число округляется в меньшую сторону, а второе округляется в большую сторону.
округленного представления выбирается равной, даже если число точно посередине между ними.
http: //linuxgazette.net/144/misc/lg/a_question_of_rounding_in_issue_143.htm:
"Для библиотеки GNU C правило округления, используемое printf (), это" округление банкиров "или" округление до четного ". Это более правильно, чем в некоторых других библиотеках C, так как в спецификации C99 говорится, что при преобразовании в десятичное число следует использовать текущий выбранный режим округления IEEE (округление по умолчанию банкиров). "