в C, почему тип Double не может дать вам 2 ^ 64, как это должно быть? - PullRequest
0 голосов
/ 22 марта 2020

Если sizeof () дает двойной тип 8 байтов. Тогда двойной тип должен уметь хранить 2 ^ 64 цифры и выводить столько цифр, что равно 2 ^ 63 = 9.2233720368548E + 18.

Но я получаю что-то странное.

     1  #include <stdio.h>
     2  #include <stdbool.h>
     3  #include <math.h>
     4  
     5  int main(){
     6  double a;
     7  
     8  a = pow(2, 63);
     9  
    10  printf("Size of Double is = %d bytes\n", sizeof(a));
    11  printf("Print full number of 2^63 = %d\n", a);
    12  
    13  return 0;
    14  }

Вместо этого вывод:

Size of Double is = 8 bytes
Print full number of 2^63 = -283958688

Если вам интересно, я работаю на 64-битной Ubuntu.

1 Ответ

1 голос
/ 22 марта 2020

64 бита могут представлять до 2 ^ 64 различных значений , но (1) C не обещает использовать все 64 бита и (2) в типе с плавающей запятой, а не все различные значения представляют целые числа.

Числа с плавающей запятой должны использовать некоторые свои биты для представления знака и показателя степени. Для большинства платформ в наши дни 64-битный double будет иметь 1 бит для знака, 11 для показателя степени и 52 + 1 для значимого. (+1 является наиболее значимым битом 1. Он на самом деле не присутствует; он подразумевается значением показателя степени, и предполагается, что он равен нулю только для показателей, значения которых представляют собой нули и денормалы.)

Конечным результатом разработки является то, что любое целое число от -2 ^ 53 до 2 ^ 53 будет соответствовать ... как и любое из этих целых чисел, умноженное на достаточно малую степень двух, если вы можете принять несколько огромных предостережений. (Подвох в том, что целые числа более 2 ^ 53 забывают все, кроме самых значимых 53 битов, поэтому, например, вы не можете добавить 1 к ним, чтобы получить следующее целое число.)

Что касается вашего printf , поскольку строка формата представляет другой тип, чем вы фактически передаете, вы сталкиваетесь с неопределенным поведением. Но один из возможных результатов заключается в том, что вы увидите десятичную версию значения битов int, представляющего ваш тип double, который, как правило, сильно отличается от того, что представляет ваш тип double.

...