2016-12-13 17 views
1

Я понимаю, что из-за того, что хранятся поплавки, есть некоторые значения, которые невозможно точно представить. (См. Why Are Floating Point Numbers Inaccurate?)Гарантированная точность с числами?

Это, как говорится, в .NET/C#, какие варианты или гарантии имеют ли они точность? https://msdn.microsoft.com/en-us/library/b1e65aza.aspx?f=255&MSPPError=-2147217396 относится к «приблизительному» диапазону. Почему в этом контексте необходимо приближение?

В конце концов, я ищу, чтобы сохранить значение как:

x.xxxxxxxx 

где величина всегда положительна. Это, похоже, не очень точное число, но я хотел бы точно знать, что все возможные числовые комбинации выше «прочны».

Edit:

Для уточнения о точном уровне точности, я хочу, я хотел бы быть в состоянии иметь восемь цифр после десятичной точки и одной цифры слева от него.

+1

Ну какой уровень точности и дальности * делать * вы хотите? Похоже, что вы можете легко использовать 'decimal' из вашего примера, но если вы хотите больше цифр, чем это, вам нужно быть более конкретным. –

+0

Я уточнил текст, чтобы быть более конкретным. Спасибо ... – BenjiFB

+2

Правильно, ну 'decimal' подходит для этого. «double» также будет прекрасным, если у него будет 15-16 цифр точности, но «десятичный» будет более предсказуемым, и я бы сказал, что он более репрезентативен, если вам очень нужны точные цифры. –

ответ

4

Похоже, что вы ищете decimal.

Из ссылке:

Precision 28-29 значащие цифры

Приблизительный диапазон (склеивание не дает форматирование показателя и т.д. так что просто проверить ссылку.)

+0

Прохладный. Вы знаете, почему https://msdn.microsoft.com/en-us/library/364x0z75.aspx?f=255&MSPPError=-2147217396 снова использует термин «приблизительный диапазон»? Подходит ли этот тип к возможному приближению, применимому к float? – BenjiFB

+1

@BenjiFB Я не уверен. Но _maybe_ это потому, что мы имеем дело с базовыми 10 цифрами, поэтому разные числа будут немного отличаться в зависимости от того, как они выравниваются с базой 2. (Просто предположим, однако.) – ispiro

+1

@BenjiFB Они, вероятно, дают приблизительный диапазон, потому что очень мало людей интересуются * точными * пределами. Это похоже на то, что нормированные значения одиночной точности IEEE-754 ('float') могут выражать величину в приблизительном диапазоне [3.2e-38, 3.4e + 38], а не указывать точные пределы [1.17549435e-38, 3.40282347e +38] – njuffa

1

какие варианты или гарантии делает один есть с точки зрения точности

база на документ буя Википедия имеет точность точность 7 значащих десятичных цифр

что-то вроде 1234567 или 1.234567 или 0,00000

Почему приближение необходимо в этом контексте

потому что это не точно. Значение с плавающей запятой IEEE 754 равно (2 - 2-23) × 2127 ≈ 3.402823 × 10^38

Возможно, вы сможете получить номер, например 3.4028239999 × 10^38, а последние 5 цифр (99999) не могут быть доверенным

+0

Получил это. Но, в конечном счете, первые 7 цифр могут быть «доверенными» с поплавком? Это только цифры, за которыми нельзя доверять? – BenjiFB

+1

@BenjiFB есть. Хотя вы хотите быть осторожным, когда делаете массовые вычисления с помощью float. вы будете терять некоторую точность каждый раз, и в конечном итоге вы можете получить 0 точность – Steve

+1

@BenjiFB На самом деле [только 6 цифр можно доверять в худшем случае] (http://www.exploringbinary.com/decimal-precision-of- двоично-плавающая точка-числа /). (Например, 9.86e-4 to 7 цифр - 9.860001e-4.) –