Лучше использовать только float вместо смешивания float и int в больших вычислениях? - PullRequest
1 голос
/ 20 мая 2009

У меня довольно большая формула, которую нужно вычислять примерно 300 раз в секунду. Большинство моих переменных являются числами с плавающей точкой, но некоторые переменные являются просто параметрами, которые входят в эту формулу. В некоторых случаях поплавок не нужен. Я мог бы использовать параметры int. Но мне интересно, если смешивание типов int и float в вычислениях приведет к тому, что система будет преобразовывать типы вместо сохранения производительности.

Ответы [ 5 ]

4 голосов
/ 20 мая 2009

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

Просто, чтобы уточнить первую часть, хотя, если у вас есть

double a = 10.0;
int b = 5;
int c = 2;

и ваша формула

double d = a + (b / c);

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

3 голосов
/ 20 мая 2009

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

2 голосов
/ 20 мая 2009

Зависит ... Вам важна правильность результата?

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int x = 5;
    int y = 2;
    float z = 12.3f;

    float result = z + (x / y);
    printf("%f\n", result);

    result = z + ((float) x) / y;
    printf("%f\n", result);

    return EXIT_SUCCESS;
}

C:\Temp> t
14.300000
14.800000

Делай то, что даст тебе правильный результат.

1 голос
/ 20 мая 2009

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

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

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

0 голосов
/ 20 мая 2009

Я бы сказал, что это зависит от того, что для вас важнее. С точки зрения производительности лучше использовать float, поскольку при этом вы не будете разыгрывать целые числа раз (примерно 300 раз в секунду;)).

Если это то, что очень часто используется в вашем коде, то вы можете быть обеспокоены этим, иначе нет необходимости вносить какие-либо изменения. Если вы не слышали или не читали « Ошибка преждевременной оптимизации », это может помочь вам. Правило 20% кода занимает 80% производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...