Есть ли тип данных с плавающей запятой, который без потерь конвертируется из int64? - PullRequest
6 голосов
/ 23 марта 2011

существует ли тип данных с плавающей запятой в Visual C ++, который обладает достаточной точностью в мантиссе, чтобы содержать INT64?

Например, можно сделать следующее:

__int64 from = 0xFFFFFFFFFFFFFFFF;
mightyFP intermediate;
__int64 to;
intermediate = from;
to = intermediate;
assert(from == to);

где mightyFP - неизвестный тип, который я ищу.

regards, Tobias

Ответы [ 3 ]

2 голосов
/ 23 марта 2011

Краткий ответ, нет.long double и double имеют одинаковое представление в визуальной студии.Для x86 размер обоих равен 64 битам, что недостаточно для хранения всего диапазона 64-битного целого числа.

Вам необходимо GMP

2 голосов
/ 23 марта 2011

См
http://en.wikipedia.org/wiki/Long_double
http://en.wikipedia.org/wiki/Extended_precision

Короче говоря, существует 10-байтовый тип «повышенной точности», поддерживаемый всеми процессорами x86 (на самом деле FPU, более поздние процессоры всегда используют его для внутренних представлений), что обычно упоминается как "длинный двойной". Но из-за отсутствия поддержки этого типа в SSE, современные компиляторы затруднили доступ - его можно превратить в псевдоним для «двойного» в зависимости от параметров компилятора (например, / Qlong-double, / Qpc80 в IntelC) и даже целевого процессора.

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

1 голос
/ 23 марта 2011

Существует плавающая точка четверной точности (long double), но я не уверен, что она достаточно точна. Возможно, вы захотите использовать библиотеку произвольной точности, например GMP или MPFR

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...