DBL_MAX & Max значение двойного - PullRequest
3 голосов
/ 29 апреля 2011

Эта строка:

NSLog(@"DBL_MAX: %f", DBL_MAX);

печатает это очень большое значение: 17976931348623157081452742373170435679807056752584499659891747680315726078002853876058955863276687817154045895351438246423432132688946418276846754670353751698604991057655128207624549009038932894407586850845513394230458323690322294816580855933212334827479

Однако, когда я проверяю двойное значение, подобное этому:

double test = 9999999999999999.0;
NSLog(@"test: %f", test);

Я получаю этот неожиданный результат:

тест: 10000000000000000.000000

Это максимальное количество цифр, дающее ожидаемый результат:

double test = 999999999999999.0;
NSLog(@"test: %f", test);

тест: 999999999999999,000000

Как я могу работать с более высокими положительными дробями?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

К сожалению, я не могу ответить на вопрос напрямую, так как не понимаю, что вы подразумеваете под «Как я могу работать с более высокими положительными фракциями?».

Однако я могу пролить свет начто такое число с плавающей точкой и что это не так.

число с плавающей точкой состоит из:

  • знак (плюс или минус)
  • Показатель степени
  • Значение (известное как «мантисса»).

Они объединяются с использованием умного кодирования, как правило, в 32, 64, 80 или 128 бит.Кроме того, некоторые специальные кодировки используются для представления + -infinity, а не числа (NaN) и + -Zero.

Поскольку у мантиссы ограниченное число битов, ваше значение может иметь только это числозначимые биты.Действительно маленькое число с плавающей точкой может представлять значения в 10 ^ -308 и большое 10 ^ 308.Однако любое число может иметь только около 16 десятичных цифр.

Другими словами, распечатка, если DBL_MAX не соответствует объему информации, хранящейся в переменной.Например, нет способа представить то же число, но с ... 7480 вместо ... 7479 в конце.

Итак, вернемся к вопросу, чтобы рассказать, как представлять ваши значенияВы должны описать, какие значения вы хотите представлять.Являются ли они действительно дробями (т.е. одно целое число делится на другое целое число), в этом случае вы можете представить это с помощью двух целых чисел.Если вы хотите представлять действительно большие значения, вы можете использовать пакеты типа http://gmplib.org

0 голосов
/ 29 апреля 2011

С плавающей точкой в ​​C # не дает точных результатов все время.Есть числа, которые не могут быть представлены в двойном, плавающем или десятичном виде.Вы можете повысить свою точность, используя «десятичное число» вместо «двойное», но это все еще не гарантирует, что все числа будут представлены точно.

...