Разница в цифрах10 между GCC и MSVC - PullRequest
5 голосов
/ 08 мая 2011

У меня есть следующий код:

#include <iostream>
#include <limits>

int main()
{
   std::cout << std::numeric_limits<unsigned long long>::digits10 << std::endl;
   return 0;
}
  • GCC 4.4 возвращает 19
  • MS VS 9.0 возвращает 18

Может кто-нибудь объяснить, почемуесть ли разница между двумя?Я ожидал, что такая константа будет одинаковой независимо от компилятора.

Ответы [ 3 ]

10 голосов
/ 08 мая 2011

Если Visual C ++ 2008 возвращает 18 для std::numeric_limits<unsigned long long>::digits10, это ошибка (у меня не установлен Visual C ++ 2008 для проверки описанного поведения).

В Visual C ++ (по крайней мере для 32-разрядных и 64-разрядных Windows) unsigned long long является 64-разрядным целочисленным типом без знака и способен представлять все целые числа от нуля до 18 446 744 073 709 551 615 (2 64 - 1).

Следовательно, правильное значение для digits10 здесь равно 19, поскольку unsigned long long может представлять 9 999 999 999 999 999 999 (19 цифр), но не может представлять 99 999 999 999 999 999 999 (20 цифр).То есть он может представлять каждое 19-значное число, но не каждое 20-значное число.

При компиляции с Visual C ++ 2010 ваша программа печатает ожидаемое значение 19.

0 голосов
/ 16 января 2014

Я ожидал бы, что такая константа будет одинаковой независимо от компилятора.

Это неверно.Компилятор может реализовать любое значение, если оно соответствует стандартам.Например, некоторые странные компиляторы на 32- или 64-битном компьютере могут иметь CHAR_BIT = 9, а unsigned long long больше не будет 64-битным, или он может использовать различные дополнения 1 или некоторые другие числовые кодировки, поэтому результат может варьироваться междукомпиляторы.

Я только что проверил, а VS 2008 все еще возвращает 19. Возможно, из-за одного из исправлений при обновлении. VS2008 результат http://imageshack.com/a/img826/6228/6qo4.png

0 голосов
/ 08 мая 2011

numeric_limits :: digits10 указывает количество десятичных цифр слева от десятичной точки, которое может быть представлено без потери точности.Итак, я думаю, что это будет отличаться от компилятора к компилятору в зависимости от деталей их реализации.

...