LinqPad является большим для тестирования linq к objects/xml/sql. Бесплатная загрузка.
Наибольшее / наибольшее целое число, которое может быть сохранено в double без потери точности, совпадает с наибольшим возможным значением числа double. То есть DBL_MAX
или приблизительно 1,8 × 10 308 (если ваш double является 64-битным двойным IEEE 754). Это целое число. Он представлен точно. Чего еще вы хотите?
Продолжайте, спросите меня, какое наибольшее целое число такое, чтобы оно и все меньшие целые числа можно было сохранить в 64-битных числах IEEE с двойной точностью без потери точности. 64-битное двойное число IEEE имеет 52 бита мантиссы, поэтому я думаю, что это 2 53 :
Или другой взгляд на это: как только смещение было снято с экспоненты, и игнорирование знакового бита как не имеет отношения к вопросу, значение, хранимое двойным числом, является степенью 2 плюс 52-битное целое число, умноженное на 2 экспоненту - 52 . Таким образом, с показателем 52 вы можете сохранить все значения от 2 52 до 2 53 -1. Затем с показателем 53 следующее число вы можете сохранить после 2 53 равно 2 53 + 1 × 2 53–52 . Таким образом, потеря точности сначала происходит с 2 53 + 1.
Или другой взгляд на это: как только смещение было снято с экспоненты, и игнорирование знакового бита как не имеет отношения к вопросу, значение, хранимое двойным числом, является степенью 2 плюс 52-битное целое число, умноженное на 2 экспоненту - 52 . Таким образом, с показателем 52 вы можете сохранить все значения от 2 52 до 2 53 -1. Затем с показателем 53 следующее число вы можете сохранить после 2 53 равно 2 53 + 1 × 2 53–52 . Таким образом, потеря точности сначала происходит с 2 53 + 1.
Или другой взгляд на это: как только смещение было снято с экспоненты, и игнорирование знакового бита как не имеет отношения к вопросу, значение, хранимое двойным числом, является степенью 2 плюс 52-битное целое число, умноженное на 2 экспоненту - 52 . Таким образом, с показателем 52 вы можете сохранить все значения от 2 52 до 2 53 -1. Затем с показателем 53 следующее число вы можете сохранить после 2 53 равно 2 53 + 1 × 2 53–52 . Таким образом, потеря точности сначала происходит с 2 53 + 1.
и игнорируя знаковый бит как не имеющий отношения к вопросу, значение, сохраненное двойным числом, является степенью 2 плюс 52-битное целое число, умноженное на 2 экспонента - 52 . Таким образом, с показателем 52 вы можете сохранить все значения от 2 52 до 2 53 -1. Затем с показателем 53 следующее число вы можете сохранить после 2 53 равно 2 53 + 1 × 2 53–52 . Таким образом, потеря точности сначала происходит с 2 53 + 1. и игнорируя знаковый бит как не имеющий отношения к вопросу, значение, сохраненное двойным числом, является степенью 2 плюс 52-битовое целое число, умноженное на 2 экспонента - 52 . Таким образом, с показателем 52 вы можете сохранить все значения от 2 52 до 2 53 -1. Затем с показателем 53 следующее число вы можете сохранить после 2 53 равно 2 53 + 1 × 2 53–52 . Таким образом, потеря точности сначала происходит с 2 53 + 1. следующее число, которое вы можете сохранить после 2 53 , будет 2 53 + 1 × 2 53 - 52 . Таким образом, потеря точности сначала происходит с 2 53 + 1. следующее число, которое вы можете сохранить после 2 53 , будет 2 53 + 1 × 2 53 - 52 . Таким образом, потеря точности сначала происходит с 2 53 + 1.9007199254740992 (то есть 9,007,199,254,740,992) без каких-либо гарантий :)
Программа
#include <math.h>
#include <stdio.h>
int main(void) {
double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
while (dbl + 1 != dbl) dbl++;
printf("%.0f\n", dbl - 1);
printf("%.0f\n", dbl);
printf("%.0f\n", dbl + 1);
return 0;
}
Результат
9007199254740991 9007199254740992 9007199254740992
Википедия говорит об этом в том же контексте со ссылкой на IEEE 754 :
В типичной компьютерной системе «двойная точность» (64-битная ) двоичное число с плавающей запятой имеет коэффициент 53 бита (один из которых подразумевается), показатель степени 11 бит и бит одного знака.
2 ^ 53 чуть больше 9 * 10 ^ 15.
Вам нужно посмотреть на размер мантиссы. 64-битное число с плавающей запятой IEEE 754 (имеющее 52 бита плюс подразумеваемая 1) может точно представлять целые числа с абсолютным значением, меньшим или равным 2 ^ 53.
1.7976931348623157 × 10 ^ 308
http://en.wikipedia.org/wiki/Double_precision_floating-point_format
DECIMAL_DIG
из
должен дать хотя бы разумное приближение к этому. Поскольку это имеет дело с десятичными цифрами и на самом деле хранится в двоичном формате, вы, вероятно, сможете сохранить что-то немного без потери точности, но точно сказать трудно. Я полагаю, вы сможете понять это из FLT_RADIX
и DBL_MANT_DIG
, но я не уверен, что полностью доверяю результату.