2016-03-10 6 views
0

машина Эпсилон для 32-битной плавающей точкой ISO-C стандарта является: 1.19209e-07 Максимальное Поплавок: 3.40282e + 38Как рассчитывается вычислительная машина epsilon?

Как машина эпсилон происходит от поплавка макс?

Я использовал этот фрагмент кода, чтобы получить значения:

std::cout<<std::numeric_limits<float>::max()<<std::endl; 
std::cout<<std::numeric_limits<float>::epsilon()<<std::endl; 
+0

См. Http://floating-point-gui.de/ –

+1

Это не производное от максимального значения. Это происходит от размера мантиссы. – interjay

+0

Просто загляните в заголовочные файлы компилятора. Вы увидите, что это не «производное», оно жестко закодировано. Очень мало оборудования осталось, что не использует IEEE-754. –

ответ

1

Как машина эпсилон происходит от поплавка макс?

Вы можете получить машину эпсилон в 754-подобной системе двоичной с плавающей точкой IEEE от максимального конечного поплавка, заметив, что максимальное конечное поплавок записываются 1,111 < п двоичных разрядов один> * 2 х макс..

В этих условиях машина epsilon в двоичном формате составляет 0.000 < n-1 двоичных цифр 0> 1.

Однако максимальный конечный поплавок и эпсилон машины представляют собой действительно разные параметры, которые фиксируют различные характеристики системы с плавающей точкой: диапазон значений, которые могут быть представлены с конечными аппроксимациями, и точность этих приближений.

EDIT: по просьбе О.П., скелетные реализации:

#include <stdio.h> 
#include <float.h> 

int main(void) { 
    printf("%a\n", FLT_MAX); 
    printf("FLT_MAX is 0x1.fffffep+127 therefore machine epsilon must be:\n"); 
    printf("   0x0.000002p0 that is approx %e in decimal\n", 0x0.000002p0); 
} 

На моей платформе я получаю результат:

 
0x1.fffffep+127 
FLT_MAX is 0x1.fffffep+127 therefore machine epsilon must be: 
      0x0.000002p0 that is approx 1.192093e-07 in decimal 

Поскольку все упражнения совершенно бессмысленно, фактическое вычисление машина epsilon от FLT_MAX оставлена ​​в качестве упражнения для читателя.

+0

Спасибо, Паска, не могли бы вы написать полный пример? Я читал, что есть итеративные подходы к получению машины epsilon, так что ваш упомянутый метод является точным? двоичные цифры 0 = 32? – user1767754

+0

@ user1767754: 'std :: numeric_limits' определяется во время компиляции (обычно кто-то читает спецификацию оборудования и работает). Зачем вам нужен подход во время выполнения? Что-то вроде 'double eps = 1.0; в то время как (1.0 + eps! = 1.0) eps/= 2; eps * = 2; 'будет делать (за исключением того, что вы должны убедиться, что добавление и сравнение выполняются в двойном, не длинном двойном). –

+0

Я просто хочу узнать это из любопытства ... в основном числовой_лимит - это минимальное число на «дворе»? Так что я подумал, что если вы знаете, как долго ярд-палка находится в единицах, которые разделены на 1, вы получите eps? но я думаю, что я слишком задумываюсь. – user1767754

Смежные вопросы