c# 非规范化浮点数:"zero literal 0.0f" 慢吗?
c# Denormalized Floating Point: is "zero literal 0.0f" slow?
我刚读到非规范化浮点数,我是否应该用几乎为零的文字替换所有零文字以获得更好的性能。
我担心我的邪恶零常数会污染我的表现。
示例:
计划 1:
float a = 0.0f;
Console.WriteLine(a);
计划 2:
float b = 1.401298E-45f;
Console.WriteLine(b);
程序 2 不应该比程序 1 快 1.000.000 倍,因为 b 可以用规范化形式的 ieee 浮点表示来表示吗?而程序 1 必须与不能直接表示的 "zero" 一起行动。
如果是这样,那么整个软件开发行业都是有缺陷的。一个简单的字段声明:
float c;
会自动将其初始化为零,这会导致可怕的性能下降。
避免提及 "Premature Optimization is the..., blablabla"。
延迟了解编译器优化工作可能会导致核工厂爆炸。所以我想提前知道我付出了什么,这样我就可以安全地忽略优化它。
Ps。我不在乎 float 是否因数学运算的结果而变得非规范化,我对此无法控制,所以我不在乎。
证明:x + 0.1f 比 x + 0 快 10 倍
Why does changing 0.1f to 0 slow down performance by 10x?
问题概要: 0.0f 是邪恶的吗?那么把它当成常量的人也是恶人吗?
非正规化没有什么特别之处使它们本质上比标准化浮点数慢。事实上,仅 支持非正规化的 FP 系统会非常快,因为它基本上只进行整数运算。
速度缓慢是因为在对法线和反法线混合执行时某些操作相对困难。将法线添加到非正规比将法线添加到法线或将非正规添加到非正规要复杂得多。计算机制更加复杂,需要更多步骤。因为大多数时候你只在法线上操作,所以针对这种常见情况进行优化是有意义的,只有当它不起作用时才转向更慢和更通用的 normal/denormal 实现。
非正规化的异常当然是 0.0,这是一个尾数为零的非正规化。因为 0 是人们经常找到并对其进行操作的那种东西,并且因为涉及 0 的操作是微不足道的,所以这些被作为快速常见情况的一部分处理。
我认为您误解了所链接问题的答案中的内容。 0 本身并没有使事情变慢:尽管在技术上是非正规的,但对它的操作很快。有问题的非正规化是在足够数量的循环迭代后存储在 y
数组中的非正规化。 0.1 相对于 0 的优势在于,在该特定代码片段中,它可以防止数字 成为 非零非正规数,而不是添加 0.1 比添加 0.0 更快(事实并非如此) .
我刚读到非规范化浮点数,我是否应该用几乎为零的文字替换所有零文字以获得更好的性能。
我担心我的邪恶零常数会污染我的表现。 示例:
计划 1:
float a = 0.0f;
Console.WriteLine(a);
计划 2:
float b = 1.401298E-45f;
Console.WriteLine(b);
程序 2 不应该比程序 1 快 1.000.000 倍,因为 b 可以用规范化形式的 ieee 浮点表示来表示吗?而程序 1 必须与不能直接表示的 "zero" 一起行动。
如果是这样,那么整个软件开发行业都是有缺陷的。一个简单的字段声明:
float c;
会自动将其初始化为零,这会导致可怕的性能下降。
避免提及 "Premature Optimization is the..., blablabla"。 延迟了解编译器优化工作可能会导致核工厂爆炸。所以我想提前知道我付出了什么,这样我就可以安全地忽略优化它。
Ps。我不在乎 float 是否因数学运算的结果而变得非规范化,我对此无法控制,所以我不在乎。
证明:x + 0.1f 比 x + 0 快 10 倍 Why does changing 0.1f to 0 slow down performance by 10x?
问题概要: 0.0f 是邪恶的吗?那么把它当成常量的人也是恶人吗?
非正规化没有什么特别之处使它们本质上比标准化浮点数慢。事实上,仅 支持非正规化的 FP 系统会非常快,因为它基本上只进行整数运算。
速度缓慢是因为在对法线和反法线混合执行时某些操作相对困难。将法线添加到非正规比将法线添加到法线或将非正规添加到非正规要复杂得多。计算机制更加复杂,需要更多步骤。因为大多数时候你只在法线上操作,所以针对这种常见情况进行优化是有意义的,只有当它不起作用时才转向更慢和更通用的 normal/denormal 实现。
非正规化的异常当然是 0.0,这是一个尾数为零的非正规化。因为 0 是人们经常找到并对其进行操作的那种东西,并且因为涉及 0 的操作是微不足道的,所以这些被作为快速常见情况的一部分处理。
我认为您误解了所链接问题的答案中的内容。 0 本身并没有使事情变慢:尽管在技术上是非正规的,但对它的操作很快。有问题的非正规化是在足够数量的循环迭代后存储在 y
数组中的非正规化。 0.1 相对于 0 的优势在于,在该特定代码片段中,它可以防止数字 成为 非零非正规数,而不是添加 0.1 比添加 0.0 更快(事实并非如此) .