#include <stdio.h>
#include <wchar.h>
int main()
{
double f = 1717.1800000000001;
wprintf(L"double %.20G\n", f);
return 0;
}
выходов (и ожидаемые ниже):GCC двойной точности Printf - неправильный выход
double 1717.1800000000000637
double 1717.1800000000001
Это на Ubuntu 11.10 x64 (но при компиляции для 32 бит).
Проблема, которую я пытаюсь решить, заключается в том, что в Windows она выводит число точно так же, как в коде, и мне нужно сделать низкоуровневое форматирование (swprintf) для работы, как в Windows, для проблем с переносимостью.
1717.1800000000001 не является точно представимым как double, поэтому вы можете получить значение рядом с ним в 'f'. Значение, сохраненное в f, равно 1717.180000000000063664629124104976654052734375. Проблема в том, что окна обрабатывают только 17 значащих цифр, хотя было запрошено 20 (это известная ошибка, AFAIK - это где-то в их баг-файле). Если вы не можете ограничить длину поля значением разумного (например, 17), вам понадобится обертка для имитации этой ошибки. – hirschhornsalz
Это очень интересно знать, можете ли вы вспомнить точную ошибку? Это то, что мне нужно, чтобы linux-версия работала, как Windows, даже с ее ошибками. – queen3
На самом деле я установил 0,17 вместо .20, и теперь linux/windows полностью совместимы. Если вы измените свой комментарий, чтобы ответить, я бы с радостью принял его. Но если вы найдете точную ссылку на ошибку, это будет еще более полезно. – queen3