Деление с плавающей запятой — предвзятость, чтобы избежать результата, меньшего, чем «точное» значение

ценность. (Это:p(k,t)для тех, кому интересно.) По сути, утилита никогда не может дать недооценкуэтого значения: безопасность вероятного простого поколения зависит на численно надежной реализации. Хотя выходные результаты согласуются с опубликованными значениями, я использовал значение DBL_EPSILON, чтобы убедиться, что деление, в частности, дает результат, который никогда не будет меньше истинного значения:

Рассмотрим: double х, у; /* присвоены некоторые значения... */

Вычисление: r = x / y;встречается часто, но эти (конечная точность) результаты могут отбрасывать значащие цифры от истинного результата — возможно, бесконечный точность рационального расширения. В настоящее время я пытаюсь смягчить это, применяя смещение к числителю, т.е.

r = ((1.0 + DBL_EPSILON) * x) / y;

Если вы знаете что-нибудь об этом предмете, p(k,t)обычно намного меньше, чем большинство оценок, но это просто недостаточно хорошо, чтобы отклонить проблему с этим «наблюдением». Я, конечно, могу заявить:

(((1.0 + DBL_EPSILON) * x) / y) >= (x / y)

Конечно, мне нужно убедиться, что «предвзятый» результат больше или равен «точному» значению.Хотя я уверен, что это связано с манипулированием или масштабированием DBL_EPSILON, я, очевидно, хочу, чтобы «предвзятый» результат как минимум превышал «точный» результат, что можно продемонстрировать в соответствии с IEEE-754. арифметические предположения.

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


РЕДАКТИРОВАТЬ: Чтобы уточнить, (((1.0 + DBL_EPSILON) * x) / y) или форма (((1.0 + c) * x) / y), не является обязательным условием. Это был просто подход, который я использовал как «вероятно, достаточно хороший», не предоставив для него прочной основы. Я могуутверждать, что числитель и знаменатель не будут особыми значениями: NaNs, Infs и т. д., а знаменатель не будет равен нулю.

8
задан David Heffernan 10 May 2012 в 10:00
поделиться