Короткий ответ: «используйте ту точность, которая требуется для приемлемых результатов».
Ваша единственная гарантия заключается в том, что операции, выполняемые с данными с плавающей запятой, выполняются как минимум в элементе выражения с наивысшей точностью. Таким образом, умножение двух float выполняется по крайней мере с точностью float , и умножение float и double будет выполнено по крайней мере с двойной точностью. Стандарт гласит, что «операции [с плавающей запятой] могут выполняться с более высокой точностью, чем тип результата операции».
Учитывая, что JIT для .NET пытается оставить ваши операции с плавающей запятой с запрошенной точностью, мы можем взглянуть на документацию Intel для ускорения наших операций. На платформе Intel ваши операции с плавающей запятой могут выполняться с промежуточной точностью 80 бит и конвертироваться до требуемой точности.
Из руководства Intel по операциям C ++ с плавающей запятой 1 (извините, только мертвое дерево), они упоминают:
- Используйте тип с одинарной точностью (например, float), если не требуется дополнительная точность, полученная с помощью double или long double. Более точные типы увеличивают требования к объему памяти и пропускной способности.
...
- Избегайте арифметических выражений смешанного типа данных
Этот последний пункт важен, так как вы можете замедлить себя с помощью ненужных приведений к / с float и удвоить , что приводит к JIT-коду, который запрашивает x87 отбрасывать его 80-битный промежуточный формат между операциями!
1. Да, это говорит C ++, но стандарт C # плюс знание CLR позволяет нам знать, что информация для C ++ должна быть применима в этом случае.