2013-07-22 4 views
0

Существуют ли неподписанные 64-битные целочисленные значения, которые не могут быть представлены с использованием типа с плавающей точкой двойной точности? (В качестве двойного тоже 64 бит должны быть некоторые.) Если да, то как я могу рассчитать все из них? (? В не грубой силе образом, может быть)Неподписанные 64-битные целые числа, которые не могут сопоставляться с двойным

ответ

1

Каждое целое число от 0 до 2^52 включительно точно представляет собой от 2^52 до 2^53 только каждое четное целое (наименьшее значение бит 0), то каждое четвертое целое число, до 2^64-2^12.

Мы могли бы обобщить с небольшим количеством кода,

с т = 52:

for (i=0; i<(64-m+1); i++) { 
      start = i ? 1ULL << (i+m) : 0; 
      end = ((1ULL << m+1)-1) << i; 
      step = 1ULL << i; 
    } 

производит:

0000000000000000 to 001fffffffffffff step 1 
0020000000000000 to 003ffffffffffffe step 2 
0040000000000000 to 007ffffffffffffc step 4 
0080000000000000 to 00fffffffffffff8 step 8 
0100000000000000 to 01fffffffffffff0 step 16 
0200000000000000 to 03ffffffffffffe0 step 32 
0400000000000000 to 07ffffffffffffc0 step 64 
0800000000000000 to 0fffffffffffff80 step 128 
1000000000000000 to 1fffffffffffff00 step 256 
2000000000000000 to 3ffffffffffffe00 step 512 
4000000000000000 to 7ffffffffffffc00 step 1024 
8000000000000000 to fffffffffffff800 step 2048 

Пример:

Назначение 0x0020000000000000 к двойному дает 9007199254740992.0 (0x0x4340000000000000 в IEEE754)

Назначение 0x0020000000000001 к двойному дает 9007199254740992,0 (то же самое значение)

Назначение 0x0020000000000002 к двойному дает 9007199254740994.0 (0x0x4340000000000001, который является следующим представимо значением)

+0

Как показатель экспоненты является смещением, смещенным в 1023, не будет ли это перемещать пороговые значения для представляемых целых чисел? Как переход от четных и нечетных чисел? – aggsol

+0

Отклонение экспоненты имеет значение только для диапазона выше и ниже 1.0, но после тестирования я сам обнаружил, что мой ответ был немного отключен, поэтому я исправил его. – matja

0

Если 64-битное число представлено следующим образом:

52 A бит, а затем, по меньшей мере, 1 B бит, за которым следует одна "1" бит ,

где A - любой бит, а один бит B должен быть не равен нулю, то он не может быть представлен как двойной. (Я полагаюсь на то, как биты используются для двойных чисел, как показано в http://en.wikipedia.org/wiki/Double-precision_floating-point_format)

1

двойной имеют 53 бит мантиссы, так что любые беззнаковые 64-битные int, которые имеют 53 последовательных значимых бита (то есть строка от первого 1 бит до последнего 1 бит длиной 53 бит или меньше) могут быть без потерь преобразованы в double.