【发布时间】:2014-06-29 11:48:04
【问题描述】:
MonoGame 是微软 XNA 的开源版本。它是一个构建跨平台游戏的框架。
它有许多数学类型,例如向量和四元数。
他们使用双打和浮点数的方式让我有点困惑。
到目前为止,我已经收集了以下信息:
- 浮点数可能比双精度数更有效;
- 双精度比浮点精度高。
这里有一种让我困惑的方法:
/// <summary>
/// Transforms a single Vector2, or the vector normal (x, y, 0, 0), by a specified Quaternion rotation.
/// </summary>
/// <param name="value">The vector to rotate.</param><param name="rotation">The Quaternion rotation to apply.</param>
public static Vector2 Transform(Vector2 value, Quaternion rotation)
{
float num1 = rotation.X + rotation.X;
float num2 = rotation.Y + rotation.Y;
float num3 = rotation.Z + rotation.Z;
float num4 = rotation.W * num3;
float num5 = rotation.X * num1;
float num6 = rotation.X * num2;
float num7 = rotation.Y * num2;
float num8 = rotation.Z * num3;
float num9 = (float) ((double) value.X * (1.0 - (double) num7 - (double) num8) + (double) value.Y * ((double) num6 - (double) num4));
float num10 = (float) ((double) value.X * ((double) num6 + (double) num4) + (double) value.Y * (1.0 - (double) num5 - (double) num8));
Vector2 vector2;
vector2.X = num9;
vector2.Y = num10;
return vector2;
}
为什么不在整个过程中使用双精度浮点数(例如,内联 num1..num8 作为 num9 和 num10 的双精度表达式)?
【问题讨论】:
-
也许相关:stackoverflow.com/questions/158889/… ...底线:在大多数情况下,性能并没有真正的差异。
-
为什么你认为双精度比浮点数慢?在大多数现代硬件中,它几乎是一样的。但在某些情况下,混合浮点数和双精度数会导致类型之间转换的额外循环
-
@LưuVĩnhPhúc “最现代的硬件”是否包括所有主流 ARM 和 x86 衍生产品(所有主流 Android、iPhone、XBox 360/Xbox One、PS4 等)?我不知道。
-
@nhgrif:对中间值使用更高的精度可以减少结果的误差。例如 (float)double_value * 10000 和 (float)(double_value * 10000) 可能不同。
-
使用双精度完成的计算越多,精度就越高。
标签: c# optimization performance floating-point