Ввод числа двойной точности - PullRequest
6 голосов
/ 23 июня 2011

Я пишу несколько астрономических программ, и у меня есть исходный код для реализации алгоритмов Джеффри Саксом в книге Астрономических алгоритмов Миуса.

Одной из написанных им функций является ReadReal (), которая получает действительное число от пользователя (через клавиатуру или терминал). Выдержка из этой функции выглядит так:

scanf("%lf", &r);
return r * 1.000000000000001;

Умножение на константу во второй строке, очевидно, как-то связано с округлением, но я не вижу точно, что именно. Я искал ответы, и константа появляется во многих местах на разных сайтах, но не в этом контексте. Кто-нибудь имеет опыт этого или знает, что здесь происходит? Это важно?

Спасибо за любую помощь.

Ответы [ 2 ]

6 голосов
/ 23 июня 2011

Это относится к параметру плотности , Ω , определяемому как средняя плотность вещества во Вселенной, деленная на критическое значение этой плотности. Это выбирает одну из трех возможных геометрий в зависимости от того, равно ли оно, меньше или больше 1. Они называются соответственно плоская, открытая и закрытая вселенные. Посмотрите на картинку ниже для визуального представления.

Visual representation of the density parameter

Указанное вами значение Ω определяется в Теории большого взрыва и порождает так называемую проблему плоскостности . Для получения дополнительной информации об этом перейдите на вики снова .

Чтобы понять важность параметра плотности, взгляните на предельную судьбу вселенной , это также дает более полное объяснение Ω.

3 голосов
/ 23 июня 2011

Числа с плавающей запятой в большинстве архитектур (в которых используется представление IEEE754 ) могут представлять только те числа, которые имеют конечное двоичное расширение , т. Е. Которые точно представлены числом, таким как 11.00100100001 (а длина строки ограничена размером типа с плавающей запятой, например, 53 для double).

Любое число, которое не имеет этой формы, то есть не является конечной суммой степеней двух, например, 1/3 или 1/5 или 1/10, может никогда быть точно выраженным как такая переменная с плавающей точкой.

Поскольку пользователи часто вводят такие значения, как 0.1, а не более подходящие 0.125, такая потеря точности часто встречается довольно рано в таких настройках, как ваши. Умножение на эту вашу константу - это один из способов, который автор на своей платформе нашел для того, чтобы приблизиться к тому, что, как он думал, предназначал пользователь. Это все субъективно, хотя. Если вы просто печатаете с короткой точностью, printf("%0.5f", x), вы не должны замечать отсутствие точности.

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