Разбор длинных и двойных

У меня есть только несколько строк кода C++ ниже:

    long re = 103491683;
    double temp = (double)re * (double)re;
    cout<<"\n"<<"double * double = \t"<<(long)temp;
    long temp2 = re * re;
    cout<<"\n"<<"long * long = \t\t"<<temp2;

и он возвращает 2 разных значения:

    double * double =   10710528450172488
    long * long =       10710528450172489 

Я не могу понять, что происходит, у меня была эта ошибка на Java, и я также пробовал на C++, и это проблема. Пожалуйста, помогите мне (извините за мой плохой английский)

3 ответа

double Номер имеет 64-битное хранилище. Из этих 64 1 используется для хранения знака, 11 - для показателя степени, а 53 - для десятичных цифр. Это означает, что максимальная точность вашего числа, которую вы можете достичь, составляет 15,95 десятичных цифр 53 * log10(2).

Ваш номер 10,710,528,450,172,489 имеет 17 десятичных цифр и, таким образом, немного превышает точность, которая может быть достигнута за double,

Максимальное количество, которое может быть достигнуто в подписанном long в 64-битных системах 2^63 - 1 = 9,223,372,036,854,775,807, что больше, чем у вас есть число.

Двойники имеют определенную неточность из-за того, как число хранится внутри. Когда вы выполняете математические операции с двойниками, эта неточность может быть усугублена. Если ваш код должен иметь возможность обрабатывать десятичные разряды, и это является недопустимым количеством ошибок, рассмотрите возможность использования библиотеки, которая допускает большие десятичные числа. Если все возможные значения re всегда будут целыми числами, тогда длинная версия должна работать нормально.

double Тип имеет точность 52 двоичных разряда, остальные - для хранения показателя степени, а один - для знака. long Тип (в большинстве 64-битных систем) имеет точность 63 бита и один для хранения знака. в double * double В расчете вы потеряли свой наименее значимый бит.

Смотрите https://en.wikipedia.org/wiki/IEEE_floating_point

Точнее для этого примера: https://en.wikipedia.org/wiki/Double-precision_floating-point_format

Другие вопросы по тегам