2015-10-04 3 views
0

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

#include <cmath> 

float constant = M_PI; 
float generate() 
{ 
    static float state = 1; 
    state = state * constant; 
    return state; 
} 

Можно было бы знать, внедрение, аппаратное обеспечение, настройки компилятора и так далее, что делает его довольно трудно предсказать, что результаты будут. Или мое мышление ошибочно?

ответ

3

«ошибки» с плавающей запятой детерминированы. Отображение 1: 1 между входными и выходными значениями для данной операции. Ваш пример будет производить одну и ту же последовательность вывода каждый раз.

При этом может существовать реализация с плавающей запятой или десять, которые будут создавать разные последовательности, но это не то, что вы можете считать «случайным» (то есть источником энтропии).

+0

Согласен. Есть ли что-то, что не является детерминированным, кроме как говорить о квантовой физике? – Zebrafish

+0

@Titone Threading Model не является детерминированным. – Ritesh

+0

Теоретически да, но так же, как неопределенное поведение непредсказуемо, не будут ли ошибки с плавающей запятой? – user5406780

1

Каждое представление с плавающей запятой определяет состав переменной с плавающей запятой (какая часть является мантиссой, какая часть является показателем, какая часть является знаком и т. Д.) И поведение каждой операции.

В любой реализации, которую вы можете выбрать, можно предсказать результат каждой операции с плавающей запятой, если вы знаете ее операнд (или операнды). Эта характеристика - это определение детерминизма.

Итак, да, операции с плавающей запятой детерминированы.

Различные реализации (компиляторы, хост-системы и т. Д.) Поддерживают различные представления с плавающей точкой. Таким образом, существует несколько вариантов результатов между реализациями. Тем не менее, все еще можно предсказать результат любой операции с плавающей запятой, если вы знаете, как представлены переменные с плавающей запятой, и как работают операции.

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

Существуют ошибочные реализации плавающей запятой, которые не соответствуют их собственной документации. Например, найдите ошибку pentium FDIV - где некоторые ранние процессоры Pentium реализовали неверное деление с плавающей запятой. Даже те, кто оказался детерминированным, поняли, что на самом деле делают операции.

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