Расчет стоимости поплавка Размеры - PullRequest
3 голосов
/ 30 марта 2011

Есть ли какая-либо разница между вычислением небольших значений с плавающей точкой, близких к 0, и больших значений с плавающей точкой, далеких от 0?

Ответы [ 5 ]

4 голосов
/ 30 марта 2011

Все зависит от платформы, которая используется для вычисления чисел с плавающей запятой.В общем, должно быть мало или нет разницы.Внутри число с плавающей запятой представляется с помощью нормализованной мантиссы (значение от 0,5 до 1,0), знака и показателя степени.Разница между малым и большим числом - это значение показателя степени.

Сказав это, есть заметное исключение.Действительно малые числа с плавающей точкой, так называемые субнормальные числа или денормализованные числа представлены по-разному, и некоторые FPU не поддерживают их.В этом случае они бегут к программному обеспечению для выполнения вычислений, что очень медленно.Конкретно, это проблема в аудиопрограмме, где звук может звенеть до чего-то, что не слышно, но как только оно станет достаточно маленьким, оно значительно замедлит вычисления.

4 голосов
/ 30 марта 2011

Насколько я понимаю, как работают процессоры, не должно быть абсолютно никакой разницы

1 голос
/ 30 марта 2011

Нет, разницы нет вообще (игнорируя вопросы точности). Числа с плавающей точкой всегда представляют число, используя знак, дробь и показатель степени. Там не может быть никакой разницы в зависимости от его «размера» и использование какой-либо целочисленной замены в случае небольших чисел или целых чисел не имеет никакого смысла (просто вызывает дополнительные издержки) - для вычисления вам придется преобразовать их все равно снова.

0 голосов
/ 30 марта 2011

Это зависит от того, о каких вычислениях вы говорите.Добавление двух чисел может занять одинаковое время независимо от величины числа.В случае деления размер операнда может иметь значение - например, см. Справочное руководство Intel стр. C.34:

Если вы попытаетесь скомпилировать следующий код, вы можетеувидеть это в действии:

// Compile with -O0 to avoid optimising out loop!
#include <iostream>
#include <sys/time.h>
#include <limits>

void test(float a, float b)
{
        struct timeval start, end;
        gettimeofday(&start, NULL);
        for (size_t i=0; i<500000; ++i)
        {
                float result = a/b;
        }
        gettimeofday(&end, NULL);
        long  seconds, useconds; 
        seconds  = end.tv_sec  - start.tv_sec;
        useconds = end.tv_usec - start.tv_usec;
        double ms = ((seconds) * 1000 + useconds/1000.0); 
        std::cout  << a << "/" << b << " takes " << ms << "ms" << std::endl;
}

int main()
{
        test(1,2);
        test(0.0005,1.0e+35);
}

Дает следующий вывод для меня

1/2 занимает 1,032 мс

0,0005 / 1e + 35 занимает 32,287 мс

0 голосов
/ 30 марта 2011

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

...