ценность. (Это: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 и т. д., а знаменатель не будет равен нулю.