gcc double printf точность - неправильный вывод - PullRequest
1 голос
/ 29 февраля 2012
#include <stdio.h>
#include <wchar.h> 
int main()
{
    double f = 1717.1800000000001;
    wprintf(L"double      %.20G\n", f);
    return 0;
}

вывод (и ожидается ниже):

double      1717.1800000000000637
double      1717.1800000000001

Это на Ubuntu 11.10 x64 (но также при компиляции для 32-битной версии).

Проблема, которую я пытаюсь решитьРешите, что в Windows он выводит число точно так же, как в коде, и мне нужно сделать низкоуровневое форматирование (swprintf) для работы, как в Windows, для проблем переносимости.

Ответы [ 4 ]

2 голосов
/ 29 февраля 2012

1717.1800000000001 не может быть точно представлен как double, поэтому вы можете получить значение, близкое к нему, только в f. Значение, сохраненное в f, равно 1717.180000000000063664629124104976654052734375.

Проблема в том, что теперь Windows выводит только 17 значащих цифр, хотя было запрошено 20 (это известная ошибка, AFAIK она где-то в их базе данных ошибок).

Если вы не можете ограничить длину поля вменяемым значением (например, "%.17G"), вам нужна оболочка для имитации этой ошибки.

1 голос
/ 29 февраля 2012

wprintf функция реализована в стандартной библиотеке C, а не в gcc.

Число 1717.1800000000001 имеет 13 цифр после плавающей запятой. Однако он не имеет точного представления в 64-разрядном двоичном формате с плавающей запятой.

Формат "%.20G" требует вывода 20 значащих цифр, что является количеством цифр в 1717.1800000000000637. Следовательно, этот результат - то, что ожидалось. Либо стандартная библиотека C для Windows обрабатывает формат по-разному, либо выполняет неправильное округление.

С другой стороны, вам может потребоваться определенное количество цифр после числа с плавающей запятой, используя формат "%f", например, "%.13f" округляет вывод до 13 цифр после числа с плавающей запятой и печатает 1717.1800000000001, как и ожидалось.

0 голосов
/ 29 февраля 2012
double f = 1717.1800000000001;

Эта строка кода не может быть выполнена точно.Константа имеет 17 десятичных цифр точности, двойной - 15,9.

0 голосов
/ 29 февраля 2012

Ну, ваш ожидаемый вывод конфликтует с вашей строкой формата.«% .20G» означает, что вам нужно 20 значащих цифр, и это то, что вы получаете.Если вам нужно 17 значащих цифр, как и ожидалось, используйте «% .17G».

...