2010-04-21 3 views
5

Как я могу перечислить все возможные значения типа данных с плавающей запятой? Я могу сделать это, используя объединение на C или C++, но будет ли оно переносимым?Итерировать все возможные значения с плавающей запятой

Как это можно сделать на других языках? Javascript?

Предположим, что я использую эту итерацию для отображения theta по sin(theta).

+0

Вы действительно пытаетесь создать таблицу поиска для греха в javascript, если да, то почему? –

+0

Вам нужна только таблица поиска, которая охватывает 0..PI/2. Все остальные значения могут быть сопоставлены с этим диапазоном (пока вы следите за знаками и т. Д.). –

+0

На самом деле не Андреас, вопрос возникает из явного праздного любопытства. –

ответ

2

Как я могу перечислить все возможные значения типа данных с плавающей точкой?

По бит вертел в IEEE-754 representation вашего значения с плавающей точкой, для поплавка вам нужно 2^32 различных представлений, предполагая, 4 байта на поплавок требует 16 Гб памяти.

Я предполагаю, что вам нужна таблица поиска для функции синуса, просто цикл от 0 до 2 * PI с шагом вашей требуемой точности.

+0

Как спрятать биты типа данных с плавающей точкой? –

+0

Используя двоичные и (&) и сдвиги (>>) для извлечения экспоненты и мантиссы, приращение мантиссы восстанавливает компоненты с помощью двоичного или (|). Я искренне надеюсь, что вы этого не сделаете. В этом апплете вы можете выделить отдельные биты в IEEE754 http://www.h-schmidt.net/FloatApplet/IEEE754.html – stacker

+1

@stacker, twiddle_float.c (6): ошибка C2296: '>>': незаконный, левый операнд имеет type 'float' –

0

Я не могу придумать портативный способ сделать это. Но, учитывая 64-битное представление (стандартный IEEE double) и предполагая, что для генерации одного значения потребуется одна наносекунда, для получения всех возможных значений потребуется более 500 лет. Таким образом, у вас есть много времени, чтобы подумать об алгоритме: ...

1

Совместный подход не совсем переносимый. Это зависит от размера любых типов, которые вы используете. (Если sizeof (your_fp_type)> sizeof (your_int_type), то вы не сможете выполнять итерацию по всему диапазону, даже если у вас было время.)

В любом случае вы поймете, что возможные значения с плавающей запятой не распределяются равномерно по диапазону любого типа, который вы выберете. Разница между значениями становится больше по мере того, как вы удаляетесь от 0. Учитывая это и время, необходимое для создания такого списка, и тот факт, что у вас даже нет достаточного пространства HD для представления всех возможных двойных (я гарантирую вы этого не делаете!), не говоря уже о RAM ... Я должен расспрашивать о ценности создания такого списка. Поиск значения займет больше времени, чем просто вычисление.

5

Взгляните на страницы руководства для nextafter() и nextafterf(). Они позволяют вам перейти от числа с плавающей запятой к ближайшему ближайшему. Вы можете использовать один из них для каждого номера FP.

0

В дополнение к nextafter(), есть также ldexp() and frexp() для работы с мантиссой и экспонентой явно.

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