使用new运算符创建类的实例时,将在堆上分配内存.当您使用new运算符创建结构的实例时,在堆上还是堆栈上分配内存?
我一直在阅读很多关于.NET中浮点确定性的内容,即确保具有相同输入的相同代码将在不同的机器上提供相同的结果.由于.NET缺少Java的fpstrict和MSVC的fp:strict等选项,因此似乎一致认为使用纯托管代码无法绕过这个问题.C#游戏AI Wars已经决定使用定点数学,但这是一个麻烦的解决方案.
主要问题似乎是CLR允许中间结果存在于FPU寄存器中,这些寄存器具有比类型的原始精度更高的精度,从而导致不可预测的更高精度结果.CLR工程师David Notario撰写的MSDN文章解释了以下内容:
请注意,对于当前规范,它仍然是提供"可预测性"的语言选择.在每次FP操作之后,该语言可以插入conv.r4或conv.r8指令以获得"可预测的"行为. 显然,这非常昂贵,不同的语言有不同的妥协.例如,C#什么都不做,如果你想缩小,你必须手动插入(浮点)和(双)强制转换.
这表明,只需为每个表达式和计算浮点数的子表达式插入显式强制转换,就可以实现浮点确定性.有人可能会在float周围编写一个包装器类型来自动执行此任务.这将是一个简单而理想的解决方案!
然而,其他评论表明它并非如此简单.Eric Lippert最近表示(强调我的):
在某些版本的运行时中,显式转换为float会产生与不这样做不同的结果.当你明确地转换为float时,C#编译器会给运行时提供一个提示,说"如果碰巧使用这个优化,就把这个东西从超高精度模式中取出".
这对运行时的"提示"是什么?C#规范是否规定显式转换为float会导致在IL中插入conv.r4?CLR规范是否规定conv.r4指令会使值缩小到其原始大小?只有当这两者都成立时,我们才能依靠显式转换来提供浮点"可预测性",正如David Notario所解释的那样.
最后,即使我们确实能够将所有中间结果强制转换为类型的原生大小,这是否足以保证跨机器的可重复性,还是有其他因素如FPU/SSE运行时设置?
我需要为没有FPU的Nintendo DS加速程序,所以我需要将浮点数学(模拟和慢速)更改为定点.
我是如何开始的,我将浮点数更改为整数,每当我需要转换它们时,我使用x >> 8将定点变量x转换为实际数字,将x << 8转换为定点.很快我发现无法跟踪需要转换的内容,我也意识到很难改变数字的精确度(在这种情况下为8).
我的问题是,我应该如何让这更容易,更快?我应该制作一个FixedPoint类,或者只是一个FixedPoint8 typedef或带有一些函数/宏的结构来转换它们,还是别的什么?我应该在变量名称中添加一些内容来显示它的定点吗?
我有一个在机器人上运行的PID控制器,旨在使机器人转向罗盘方向.以20Hz的速率重新计算/应用PID校正.
虽然PID控制器在PD模式下运行良好(IE,积分项为零),但即使是最轻微的积分也会迫使输出不稳定,使得转向执行器被推到左或右极限.
码:
private static void DoPID(object o)
{
// Bring the LED up to signify frame start
BoardLED.Write(true);
// Get IMU heading
float currentHeading = (float)RazorIMU.Yaw;
// We just got the IMU heading, so we need to calculate the time from the last correction to the heading read
// *immediately*. The units don't so much matter, but we are converting Ticks to milliseconds
int deltaTime = (int)((LastCorrectionTime - DateTime.Now.Ticks) / 10000);
// Calculate error
// (let's just assume CurrentHeading …Run Code Online (Sandbox Code Playgroud) 我有一个连接到主处理器的协处理器.某些浮点计算需要在协处理器中完成,但它不支持硬件浮点指令,并且仿真速度太慢.
现在,一种方法是让主处理器缩放浮点值,以便它们可以表示为整数,将它们发送给执行某些计算的协处理器,并在返回时缩减这些值.然而,这在大多数情况下都不会起作用,因为数字最终会变得太大或太小而不能超出这些整数的范围.所以我的问题是,正确做到这一点的最快方法是什么.
我正在用C#编写2D空间RTS游戏.单人运动.现在我想添加一些多人游戏功能.我用谷歌搜索它似乎只有一种方法可以让数千个单元在没有强大的网络连接的情况下连续移动:在每个玩家运行相同的模拟时,只通过网络发送命令.
现在整个发动机到处使用双打都存在问题.浮点计算在很大程度上取决于编译器优化和cpu体系结构,因此很难保持同步.它根本不是基于网格的,并且有一个简单的phisics引擎来移动太空船(太空船有冲动和角动量......).因此重新编码整个东西以使用固定点将是非常麻烦的(但可能是唯一的解决方案).
所以到目前为止我有两个选择:
所以我寻找更好的意见,(甚至是将代码迁移到定点而不会搞砸一切的提示......)
看起来固定点数据类型会有很多用途.为什么.NET中没有一个?
注意:我知道我们可以创建自己的类/结构来满足我们的定点目的和需求.那不是我的问题.我想知道为什么MS决定不包括定点数字数据类型.
我目前正在尝试弄清楚如何以定点表示形式将两个数字相乘。
假设我的数字表示如下:
[SIGN][2^0].[2^-1][2^-2]..[2^-14]
Run Code Online (Sandbox Code Playgroud)
就我而言,数字10.01000000000000 = -0.25.
例如我会怎么做0.25x0.25等等-0.25x0.25?
希望您能帮忙!