@barbedman

Почему при достаточно малых значениях вещественного числа кол-во итераций при нахождении машинного эпсилон резко убывает?

В общем, есть такой участок кода:
cout<< "Wtite a num:";cin>>fNum;
fNum=pow(fNum,-5);
fMachineEps=fNum2=fNum;
do
{
fMachineEps/=2;
fNum=fNum2+fMachineEps;
++itersAmount;
}while(fNum>fNum2);
На входе мы получаем число 10(float) и возводим его в некоторую отрицательную степень, а затем находим для него машинный эпсилон, т.е., если я правильно понимаю, минимальное число, которое будет восприниматься машиной не как ноль, ну и считается кол-во итераций, которое остается стабильным(25) до 10^(-38). Дальше идет убывание по 3-4 итерации с каждой степенью. Почему это происходит? Я предполагаю, что дело в том, что При достижении таких значений я приближаюсь к минимально возможным значения типа данных float, поэтому требуется меньше вычислений.
  • Вопрос задан
  • 268 просмотров
Пригласить эксперта
Ответы на вопрос 2
ThePyzhov
@ThePyzhov
iOS Ninja
float максимально держит до +/-38 степени число.

Тут таблица размерностей типов.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Машинный эпсилон — это минимальное число, что 1 + ε ≠ 1. Так что, в принципе, ты вычислил его правильно, хоть код и студенческий. Но есть один нюанс.

Дело в том, что float и double бывают нормализованные и денормализованные. Что это такое?
Любое число в двоичной системе счисления начинается с единицы. Поэтому головная единица подразумевается и не хранится — т.н. «нормализованное число». НО: когда порядок 00…00, считается, что в голове НОЛЬ, а относительная погрешность сменяется абсолютной — это денормализованное число.

0 1010…00 00000001 = +0,11012×2−127 — нормализованное число
0 1010…00 00000000 = +0,01012×2−127 — денормализованное
0 0000…00 00000000 = +0,00002×2−127. Ноль — тоже денормализованное число.

10−38 — минимальное нормализованное число. 10−45 — минимальное денормализованное, с мантиссой 0,00…001. Помнишь, я говорил, что в денормализованных числах относительная погрешность сменяется абсолютной в эти самые 10−45 — потому чем меньше число, тем больше «типа-эпсилон».

10-байтовый extended, он же long double, насколько мне известно, не нормализован, т.е. головная единица там хранится явно. Но такая точность редко нужна, появляется перерасход памяти (2 или 6 байтов, в зависимости от процессора и его настроек), да и не слишком оптимизируют сопроцессоры под такие числа.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы