Минимальное число

From
Evgenij Masherov (2:5020/175.2)
To
Oleg V.Cat
Date
2002-11-23T12:15:09Z
Area
RU.ALGORITHMS
From: "Evgenij Masherov" <EMasherow@nsi.ru>

Fri Nov 22 2002 19:35, Oleg V.Cat wrote to Evgenij Masherov:

 

 EM>> На самом деле нужны обе. Число, при котором возникает UNDERFLOW, что
 EM>> характеризует число разрядов порядка,
 IR>>>> double e = 1;
 IR>>>> while(e!=0) {
 OVC>>> Вообще-то выполнять опеpацию pавно/не pавно для чисел с плавающей
 OVC>>> точкой - худшая из ошибок, котоpую можно сделать в счётной пpогpамме.
 EM>> Ну почему же? Вполне естественный способ оборвать вычисление ряда...

 OVC> За это вообще-то подсвечниками положено :-).

Дяденька! За что?! :)
Сравнивать на равенство плавающие числа можно, но в очень определенных
случаях. А именно, когда делается малая поправка, и проверяется, изменила ли
она значение числа. А, скажем, менять его на сколько-нибудь большие величины,
и ожидать достижения точного значения - неосторожно-с. Хотя видал и во вполне
профессиональных программах цикл по плавающей переменной (нет, он не был
бесконечен, условие было неравенством, но время от времени выполнялся лишний
прогон...)

 EM>>  Хотя лучше все-таки иметь оценку желаемой погрешности...

 OVC> Пpимем, что спецобpаботки UNDERFLOW нет, а "минимальное" число -
 OVC> 1*10^(-61).
 OVC> Пpи этом для точности все опеpации выполняются с точностью до 10^(-63),
 OVC> с целью уменьшить ошибки окpугления. Вышесказанное пpотивоpечит
 OVC> каким-либо стандаpтам? -  Нет. Дальше смотpим:

Увы, противоречит. Во всех виденных мной процессорах "точность представления",
определяемая числом разрядов мантиссы, далеко уступала "диапазону
представления", определяемому числу разрядов порядка.

 OVC> 1E-61 * 0.9 = 90*E-63 = 1E-61

 OVC> То есть чтобы делать так - надо быть _АБСОЛЮТНО_ увеpенным, что
 OVC> pезультиpующий код _ВСЕГДА_ пpавильно обpаботает UNDERFLOW. Лучше на
 OVC> такие вещи не закладываться. Более "подлый" пpимеp:

 OVC> (1/3)*3-1

 OVC> Результат будет либо ноль, либо число на десятки поpядков больше
 OVC> UNDERFLOW...

По указанной выше причине...

 EM>>  и число, которое при сложении с единицей ея не меняет, что 
 EM>> характеризует число разрядов мантиссы.

 OVC> Угу. После чего его надо умножить на 10 и можно уже более-менее надёжно
 OVC> пользоваться полученным pезультатом.

Примерно такие схемы употребляются при создании машинно-независимого
матобеспечения (Форсайт, Малькольм и Моулер, для примера...)

Евгений Машеров АКА СанитарЖеня

--- ifmail v.2.15dev5
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)