В программировании на языке Си будет ли вычисление медленнее, если любая переменная в выражении является nan
Это совершенно гипотетический вопрос.
В приведенном ниже коде я выполняю вычисление, которое имеет одну переменную, z, в качестве значения, присвоенного "nan". Основной расчет будет медленнее по сравнению с нормальным значением z (например, z = 1.0)
float z = 0.0/0.0; // that means z is "nan"
float p = 50.0, q = 100.0, r = 150.0;
// main calculation Type 1
float c = ((x*100)+(y*100))/(x*100)+(y*100)+152*(p+q/r)+z;
Вот пример, чтобы показать основной расчет с нормальным значением z
float z = 1.0; // normal value for z
float p = 50.0, q = 100.0, r = 150.0;
// main calculation Type 2
float c = ((x*100)+(y*100))/(x*100)+(y*100)+152*(p+q/r)+z;
Следовательно, какой из них медленнее, Тип 1 или Тип 2? Или разницы во времени не будет?
При одиночном вычислении разница во времени может быть не видна, но если мы соберем миллионы таких уравнений, как будут меняться результаты во времени?
Любая мысль, логика или информация будут оценены по достоинству.
Примечание: В настоящее время меня не волнует результирующее значение переменной 'c';
4 ответов:
Это зависит от процессора. Старые x86 чипы intel, без SSE, очень плохо справлялись с NAN (см. http://www.cygnus-software.com/papers/x86andinfinity.html для анализа 10-летней давности.) Однако SSE2 / 3 / 4 не страдает от этой проблемы, и я не верю, что AMD когда-либо страдала.
Вы вполне можете увидеть эту проблему на современных чипах, если скажете компилятору избегать инструкций SSE для возможной совместимости (но это определенно замедлит работу с плавающей точкой независимо от NaNs, поэтому не делайте этого если только тебе не придется.) Насколько мне известно, этот режим совместимости по-прежнему является GCC по умолчанию для x86-сборок.
Я не знаю о единицах ARM с плавающей запятой; вам придется проверить.
Я подозреваю, что Наны-это не та проблема, которой они были десять лет назад, но достаточно людей имеют смутную память о тех временах, что предубеждение, несомненно, будет жить еще некоторое время.
Критическое мышление действительно заставляет меня бросить вызов моему пониманию С. Я думаю, что лучший ответ-это экспериментировать. Использование времени.h для сохранения времени часов до и после каждого вычисления и вычисления разницы.
#include<stdio.h> #include<time.h> clock_t t1, t2; float result; t1 = clock(); //perform calculation1 t2 = clock(); printf("%f", result); t1 = clock(); //perform calculation2 t2 = clock(); printf("%f", result);
На некоторых архитектурах RISC, таких как MIPS, модуль с плавающей запятой предназначен для обработки общего случая как можно быстрее. Блок с плавающей запятой ловит, когда он сталкивается с NaN,тогда остальная часть вычисления обрабатывается с помощью программного эмулятора с плавающей запятой IEEE. Поэтому вычисление с помощью NaNs будет намного медленнее на такой архитектуре. AFAIK это не относится к архитектуре Intel x86.
Никакой разницы не будет.
На низком уровне компьютер просто присваивает значение. Не проверяет, что там было раньше.
Коды сборки вычислений должны быть одинаковыми.
Если вы проверяете весь код, первая программа должна быть медленнее, потому что вы делаете в ней дополнительные вычисления. (0.0/0.0).
Comments