преобразование действительно большого int в удвоение, потеря точности на каком-то компьютере - PullRequest
0 голосов
/ 25 сентября 2018

В настоящее время я изучаю преобразование данных между типами в cpp.Меня учили, что

При действительно большом int мы можем (для некоторых компьютеров) потерять точность при преобразовании в double.

Но никаких причин не былопредусмотрено для заявления.

Может ли кто-нибудь дать объяснение и пример?Спасибо

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Предположим, что число с плавающей запятой использует N битов памяти.

Теперь предположим, что это число с плавающей запятой может точно представлять все целые числа, которые могут быть представлены целочисленным типом из N битов.Поскольку N-битное целое число требует, чтобы все его N-биты представляли все его значения, так же было бы требованием для этого числа с плавающей запятой.

Число с плавающей запятой должно быть в состоянии представлять дробные числа.Однако, поскольку все биты используются для представления целых чисел, остаются нулевые биты для представления любого дробного числа.Это противоречие, и мы должны сделать вывод, что предположение о том, что float может точно представлять все целые числа, так как целочисленный тип одинакового размера, должно быть ошибочным.

Поскольку в диапазоне N-битных целых чисел должны быть не представимые целые числа, возможно, что преобразование такого целого числа в число с плавающей запятой из N битов потеряет точность, если преобразованное значение окажется одним из непредставляемых.


Теперь, поскольку плавающая точка можетпредставляют подмножество рациональных чисел, некоторые из этих представимых значений могут действительно быть целыми числами.В частности, спецификация IEEE-754 гарантирует, что двоичная с плавающей запятой двойной точности может представлять все целые числа вплоть до 2 53 .Это свойство напрямую связано с длиной мантиссы .

Поэтому невозможно потерять точность 32-битного целого числа при преобразовании в двойное число в системе, которая соответствует IEEE-754.


Технически, модуль с плавающей запятой в архитектуре x86 на самом деле использует 80-битный расширенный формат с плавающей запятой, который предназначен для точного представления всех 64-битных целых и может быть доступениспользуя тип long double.

0 голосов
/ 25 сентября 2018

Это может произойти, если int является 64-битным, а double также 64-битным.Числа с плавающей точкой состоят из мантиссы (представляет цифры) и экспоненты.Поскольку у мантиссы для double в таком случае меньше битов, чем у int, то double может представлять меньше цифр, и происходит потеря точности.

...