Точность с плавающей запятой в XNA

Я использую Visual Studio 2010 Ultimate, работаю над .Net framework 4.

Проблема точности

Тип groundControlPoint и worldPositionVector2 из среды XNA.

Я знаю, что каждый отладчик использует свое собственное управление точностью, но из-за этой проблемы мой код не работает. Я хочу сравнить свое добавление с заданным значением с плавающей запятой (которое в моем случае равно 5166.28003..), но поскольку результат моего добавления равен 5166.28027, это всегда неправильно...

Любые советы о том, как это понять?


person s0ubap    schedule 11.01.2013    source источник
comment
Ну, мне действительно не нужна очень высокая точность здесь ... Это стандартное сложение с плавающей запятой, и разница между двумя результатами огромна, не так ли?   -  person s0ubap    schedule 11.01.2013
comment
@ s0ubap - разницу, которую вы видите, следует ожидать при использовании float, см. Мой ответ.   -  person Richard Ev    schedule 11.01.2013
comment
Не могли бы вы опубликовать расчеты, которые вы выполняете на этом поплавке? Вы можете изменить порядок вычислений, чтобы сохранить точность, и/или переместить тест в другое место. Повышение точности может оставаться последним средством. О, и @Dimitri прав - вам следует вернуться и принять некоторые ответы на ваши предыдущие вопросы.   -  person Ani    schedule 11.01.2013
comment
Хорошо, я исправил свою проблему, просто создав функцию «Почти равно», используя правильный эпсилон в соответствии с 7-значной точностью числа с плавающей запятой. Кажется, работает отлично. Я изменю float на double, если мне нужно, но это много работы, поэтому я бы не стал :) Спасибо всем!   -  person s0ubap    schedule 11.01.2013


Ответы (2)


float имеет точность только до 7 цифр. Взгляните на MSDN.

Тип float может представлять значения в диапазоне приблизительно от 1,5 × 10–45 до 3,4 × 1038 с точностью до 7 цифр.

Тип decimal выглядит лучше для вашей ситуации .

Десятичный тип — это 128-битный тип данных, подходящий для финансовых и денежных расчетов. Десятичный тип может представлять значения в диапазоне от 1,0 × 10–28 до примерно 7,9 × 1028 с 28–29 значащими цифрами.

person Soner Gönül    schedule 11.01.2013
comment
Я думаю, что он использует переменную Vector2 в XNA, которая определяет X как число с плавающей запятой, поэтому он не может контролировать, какую переменную использовать, РЕДАКТИРОВАТЬ: кроме приведения перед добавлением - person Sayse; 11.01.2013
comment
@Sayse Вы правы, у меня нет никакого контроля ... Единственное хорошее решение, которое я вижу, - это создать свой собственный класс Vector2, используя double ... Но тогда мне придется иметь дело с выступлениями, я думаю - person s0ubap; 11.01.2013

Как указано в MSDN, float имеет точность всего 7 цифр...

Тип float может представлять значения в диапазоне примерно от 1,5 × 10E−45 до 3,4 × 10E38 с точностью до 7 цифр.

В вашем случае значение, с которым вы имеете дело, равно 5166.28003, поэтому оно будет точным только до 3-го десятичного знака.

Если вам нужна более высокая точность, рассмотрите возможность использования double (точность 15–16 цифр) или decimal (который обычно используется для финансовых и денежных расчетов).

person Richard Ev    schedule 11.01.2013