#c #floating-point #precision #floating-accuracy #numerical-methods
#c #с плавающей запятой #точность #плавающая точность #численные методы
Вопрос:
Я численный физик, и я видел некоторые коды моделирования в моем сообществе, в которых используется поле 3D-моделирования с центром в [0.5, 0.5, 0.5]
и нормализованной длиной 1
(поэтому координаты поля переходят от 0.
к 1.
). В этом блоке выполняется много физических вычислений, и, как правило, требуется максимально возможная точность.
Я думаю, что выполнение такой вещи можно рассматривать как дефект, но я хотел бы получить подтверждение этого. Я склонен думать, что это дефект, потому что, поскольку у нас больше числовой точности 0.
, числовая точность не очень хорошо сбалансирована во всем блоке.
Чтобы иметь хороший баланс, я думаю, что такая коробка :
- должно быть сосредоточено вокруг
0.
(переход от-0.5
к0.5
), если требуется симметричная точность вокруг центра блока - должно быть сосредоточено вокруг
1.5
(переход от1.
к2.
), если требуется квазиоднородная точность во всем блоке
Я прав или совершенно не прав?
Комментарии:
2. Если домен ограничен таким образом, арифметика с фиксированной точкой может быть более подходящей. Использование домена [1.0-2.0] в FP будет использовать только 23 из 32 бит или 53 из 64 (при условии, что IEEE754).
3. Я согласен с фиксированной точкой. Если это делается с использованием 32-битных или 64-битных целых чисел, это, вероятно, также более эффективно. И точность одинакова во всем диапазоне.
Ответ №1:
Вы правы.
Точность от 1.0 до 2.0 будет одинаковой по всей поверхности, как будто вы используете фиксированную точку.
Точность от -0.5 до 0.5 будет самой высокой вокруг центральной точки и ниже у краев (но все же довольно хорошей).
Точность от 0.0 до 1.0 будет самой высокой вокруг угла (0.0, 0.0) и самой низкой вокруг угла (1.0, 1.0), поэтому она будет вести себя немного неравномерно.
Комментарии:
1. Как человек, который знает только, что float не совсем точен из-за ошибок округления, не могли бы вы объяснить, почему точность некоторых чисел выше, чем у других? Кроме того, точность просто падает, чем дальше вы находитесь от 0?
2. Потому что числа с плавающей запятой состоят из трех частей фиксированной длины: знакового бита, экспоненты и мантиссы. `число = знак ( /- 1) * мантисса * 2** показатель степени. (Хотя это не совсем точно. Ищите, и вы найдете более точные ответы)
3. steve.hollasch.net/cgindex/coding/ieeefloat.html Если вы искренне любопытны и любите математику.
4. @A.Andevski: поскольку числа с плавающей запятой расположены примерно логарифмически, между, скажем, 1/64-м и 1/32-м числом столько же чисел с плавающей запятой, сколько между 1/4 и 1/2 или 1/2 и 1. Таким образом, между 0 и 0.5 более чем в 100 раз больше
float
s, чем между 0.5 и 1.0; посколькуdouble
их более чем в 1000 раз больше.