Проблема с очень маленькими числами? - PullRequest
0 голосов
/ 26 августа 2009

Я пытался присвоить очень маленькое число двойному значению, например так:

double verySmall = 0.000000001;

9 дробных цифр. По какой-то причине, когда я умножаю это значение на 10, я получаю что-то вроде 0,000000007. Я немного помню, что были проблемы с записью больших чисел, таких как этот текст, в исходный код. Должен ли я обернуть его в какую-нибудь функцию или директиву, чтобы правильно передать его компилятору? Или можно набирать такие маленькие цифры в тексте?

Ответы [ 3 ]

4 голосов
/ 26 августа 2009

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

3 голосов
/ 26 августа 2009

Стандартные числа с плавающей запятой не сохраняются в идеальном формате, они хранятся в формате, который является достаточно компактным и довольно простым для выполнения математических операций. Они неточны на удивительно малых уровнях точности. Но быстро. Подробнее здесь .

Если вы имеете дело с очень маленькими числами, вам нужно посмотреть, предоставляет ли Objective-C или Cocoa что-то аналогичное классу java.math.BigDecimal в Java. Это как раз для работы с числами, где точность важнее скорости. Если его нет, вам может понадобиться перенести его (исходный код BigDecimal доступен и довольно прост).

РЕДАКТИРОВАТЬ: iKenndac указывает NSDecimalNumber класс , который является аналогом для java.math.BigDecimal. Порт не требуется.

0 голосов
/ 26 августа 2009

Как обычно, вам нужно прочитать что-то вроде this , чтобы узнать больше о том, как числа с плавающей запятой работают на компьютерах. Вы не можете ожидать, что сможете хранить любую случайную дробь с идеальными результатами, так же, как вы не можете ожидать, чтобы хранить любое случайное целое число. Внизу есть биты, и их количество ограничено.

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