草庐IT

floating-point-conversion

全部标签

c# - 如果与 NaN 的比较始终返回 false,我如何将 float 与 NaN 进行比较?

我将一个浮点值设置为NaN(在监window口中看到),但我不知道如何在代码中检测到它:if(fValue==float.NaN)//returnsfalseeventhoughfValueisNaN{} 最佳答案 你想要float.IsNaN(...)。与NaN的比较总是返回false,无论float的值是多少。这是float的怪癖之一。这意味着您可以这样做:if(f1!=f1){//Thisconditionalwillbetrueiff1isNaN.事实上,这正是IsNaN()的工作原理。

c# - 强制 float 在 .NET 中是确定性的?

我已经阅读了很多关于.NET中的浮点确定性的文章,即确保具有相同输入的相同代码将在不同机器上产生相同的结果。由于.NET缺少Java的fpstrict和MSVC的fp:strict等选项,theconsensusseemstobe使用纯托管代码无法解决此问题。C#游戏AIWars已决定使用Fixed-pointmath相反,但这是一个麻烦的解决方案。主要问题似乎是CLR允许中间结果存在于精度高于类型的native精度的FPU寄存器中,从而导致无法预测的更高精度结果。一个MSDNarticlebyCLRengineerDavidNotario解释如下:Notethatwithcurren

c# - 如何在 C# 中处理非规范化 float ?

只需阅读此fascinatingarticle关于使用非规范化float(非常接近0的float)的IntelCPU可能会导致20x-200x的减速。SSE有一个选项可以将它们四舍五入为0,从而在遇到此类浮点值时恢复性能。C#应用程序如何处理这个问题?是否有启用/禁用_MM_FLUSH_ZERO的选项? 最佳答案 没有这样的选项。C#应用程序中的FPU控制字在启动时由CLR初始化。更改它不是框架提供的选项。即使您尝试通过调用_control87_2()来更改它那么它不会持续很长时间;任何异常都会导致控制字被CLR内部的异常处理实现再

c# - float 解析 : Is there a Catch All algorithm?

多文化编程中有趣的部分之一是数字格式。美国人使用10,000.50德国人使用10.000,50法语使用10000,50我的第一种方法是获取字符串,向后解析它直到遇到分隔符并将其用作我的小数点分隔符。这有一个明显的缺陷:10.000会被解释为10。另一种方法:如果字符串包含2个不同的非数字字符,则使用最后一个作为小数点分隔符并丢弃其他字符。如果我只有一个,请检查它是否出现不止一次,如果出现则丢弃它。如果它只出现一次,请检查它后面是否有3位数字。如果是,则丢弃它,否则,将其用作小数点分隔符。显而易见的“最佳解决方案”是检测用户的文化或浏览器,但如果您的法国人使用的是en-USWindows

c# - 为什么在声明 float 时需要 "f"?

例子:floattimeRemaining=0.58f;为什么这个数字的末尾需要f? 最佳答案 您的float声明包含两部分:声明变量timeRemaining类型为float.它赋值0.58到这个变量。问题出现在第2部分。右侧是自行求值的。根据C#规范,包含小数点但没有后缀的数字被解释为double。.所以我们现在有一个double我们要分配给float类型变量的值.为此,必须从double进行隐式转换。至float.没有这样的转换,因为您可能(在这种情况下确实)在转换中丢失信息。原因是编译器使用的值并不是真正的0.58,而是最接

c# - float 与双重性能

我做了一些计时测试,也阅读了一些文章,比如thisone(最后一条评论),看起来在Release构建中,float和double值花费相同的处理时间。这怎么可能?当float与double值相比精度较低且较小时,CLR如何才能在相同的处理时间内获得double值? 最佳答案 至少在x86处理器上,float和double将分别由FPU转换为10字节的实数进行处理。FPU没有针对其支持的不同浮点类型的单独处理单元。float比double快的古老建议在100年前应用,当时大多数CPU没有内置FPU(而且很少有人有单独的FPU芯片),因

c# - 在 C# 中将字符串转换为 float

我正在转换一个像“41.00027357629127”这样的字符串,我正在使用;Convert.ToSingle("41.00027357629127");或float.Parse("41.00027357629127");这些方法返回4.10002732E+15。当我转换为float时,我想要“41.00027357629127”。这个字符串应该是一样的... 最佳答案 您线程的语言环境设置为小数点为“,”而不是“.”。尝试使用这个:float.Parse("41.00027357629127",CultureInfo.Invar

C# 浮点表达式 : strange behavior when casting the result float to int

我有以下简单代码:intspeed1=(int)(6.2f*10);floattmp=6.2f*10;intspeed2=(int)tmp;speed1和speed2应该有相同的值,但事实上,我有:speed1=61speed2=62我知道我应该使用Math.Round而不是转换,但我想了解为什么值不同。我查看了生成的字节码,但除了存储和加载之外,操作码是相同的。我也在java中尝试了相同的代码,我正确地获得了62和62。谁能解释一下?编辑:在真正的代码中,它不是直接6.2f*10而是一个函数调用*一个常量。我有以下字节码:对于speed1:IL_01b3:ldloc.sV_8IL_0

c# - 为什么 HashSet<Point> 比 HashSet<string> 慢这么多?

我想存储一些不允许重复的像素位置,所以首先想到的是HashSet或类似的类(class)。然而,与HashSet之类的东西相比,这似乎非常慢.例如,这段代码:HashSetpoints=newHashSet();using(Bitmapimg=newBitmap(1000,1000)){for(intx=0;x大约需要22.5秒。虽然下面的代码(由于显而易见的原因,这不是一个好的选择)只需要1.6秒:HashSetpoints=newHashSet();using(Bitmapimg=newBitmap(1000,1000)){for(intx=0;x那么,我的问题是:这是有原因的吗?

c# - 如何修复 WPF 错误 : "Program does not contain a static ' Main' method suitable for an entry point"?

突然间,我的整个项目完全停止编译,并显示以下消息:Program'path_to_obj_project_folder'doesnotcontainastatic'Main'methodsuitableforanentrypoint我没有更改项目属性,只是添加了一些类,将其他一些类移到了文件夹中。它是一个WPF应用程序项目,因此应该没问题。入口点在它应该在的地方,文件App.xaml根本没有被修改:(我应该怎么做才能让它重新工作?注意供引用:如果重命名App.xaml可能会发生这种情况。正如OP所述,App.xaml没有改变;但是,这是为重命名App.xaml的任何人添加的。