Tag: 浮点

查找具有相同内部表示的float / double的最小值/最大值

刷新浮点 (也是PDF ),IEEE-754并参与有关转换为字符串时浮点舍入的讨论 ,让我修补一下:如何获得给定浮点数的二进制表示的最大值和最小值是平等的。 免责声明 :对于本次讨论,我喜欢坚持IEEE-754所描述的32位和64位浮点。 我对扩展浮点(80位)或四边形(128位IEEE-754-2008)或任何其他标准(IEEE-854)不感兴趣。 背景 :计算机在二进制表示中表示不好。 在C#中,float在内部将此表示为3DCCCCCD (C#使用舍入到最近),将double表示为3FB999999999999A 。 相同的位模式用于十进制0.100000005 (浮点)和0.1000000000000000124 (双0.1000000000000000124 ),但不用于0.1000000000000000144 (双0.1000000000000000144 )。 为方便起见,以下C#代码给出了这些内部表示: string GetHex(float f) { return BitConverter.ToUInt32(BitConverter.GetBytes(f), 0).ToString(“X”); } string GetHex(double d) { return BitConverter.ToUInt64(BitConverter.GetBytes(d), 0).ToString(“X”); } // float Console.WriteLine(GetHex(0.1F)); // double Console.WriteLine(GetHex(0.1)); 在0.1的情况下,没有用相同的位模式表示的低十进制数,任何0.99…99将产生不同的位表示(即,浮点数为0.999999937 3F7FFFFF内部产生3F7FFFFF )。 我的问题很简单:如何找到内部存储在同一二进制表示中的给定float(或double)的最低和最高十进制值。 为什么 :(我知道你会问)在转换为字符串时从.NET中舍入时发现错误,当它从字符串转换时,找到内部精确值并更好地理解我自己的舍入错误。 我的猜测是这样的:取尾数,移除其余部分,得到其精确值,得到一个(尾数位)更高,并计算平均值:低于该值的任何东西将产生相同的位模式。 我的主要问题是:如何将小数部分作为整数(位操纵它不是我最强的资产)。 Jon Skeet的DoubleConverter课程可能会有所帮助。

浮点等于的意外结果

问题不在于为什么0.1 + 0.9不等于1.0 。 它关于等于的不同行为。 有人能解释为什么下面的例子有不同的作 float q = 0.1f; float w = 0.9f; float summ = q + w; q + w == 1.0f; // False summ == 1.0f; // True 为什么operator ==工作方式不同?

在协议缓冲区中表示System.Decimal的最佳方法是什么?

继这个问题之后,在协议缓冲区中表示System.Decimal对象的最佳方法是什么?

NaN对双打意味着什么?

NaN和Infinity什么区别? NaN何时出现? 它是什么?

.NET的Double.ToString方法中的Round-two错误

在数学上,考虑这个问题的有理数 8725724278030350 / 2**48 其中分母中的**表示取幂,即分母是2到48次幂。 (分数不是最低的,可以减少2.)这个数字可以完全表示为System.Double 。 它的十进制扩展是 31.0000000000000’49’73799150320701301097869873046875 (exact) 撇号不代表缺失的数字,而只是标记圆形到15的分数。 将执行17位数字。 请注意以下内容:如果此数字四舍五入为15位,则结果为31 (后跟十三个0秒),因为下一个数字( 49… )以4开头(意味着向下舍入)。 但如果该数字首先四舍五入为17位, 然后舍入为15位,则结果可能为31.0000000000001 。 这是因为第一轮舍入将49…数字增加到50 (terminates) (下一个数字为73… ),然后第二轮可能再次向上舍入(当中点舍入规则说“圆形”时远离零“)。 (当然,还有更多具有上述特征的数字。) 现在,事实certificate.NET的这个数字的标准字符串表示是”31.0000000000001″ 。 问题:这不是一个错误吗? 通过标准字符串表示,我们指的是由参数文件Double.ToString()实例方法生成的String ,它当然与ToString(“G”)生成的String相同。 一个有趣的事情是,如果你将上面的数字转换为System.Decimal那么你得到一个完全正确的31的decimal ! 请参阅此Stack Overflow问题 ,以讨论将Double为Decimal涉及首次舍入到15位数这一令人惊讶的事实。 这意味着转换为Decimal ToSting()正确的舍入值设置为15位数,而调用ToSting()则会生成不正确的舍入值。 总而言之,我们有一个浮点数,当输出给用户时,它是31.0000000000001 ,但是当转换为Decimal (其中29位可用)时,精确地变为31 。 这很不幸。 这里有一些C#代码供您validation问题: static void Main() { const double evil = 31.0000000000000497; string exactString = DoubleConverter.ToExactString(evil); […]

随时间推移两个值之间的Lerp

我正在尝试将浮点数减少一个时间值,我正在使用Unity并停止时间Time.timeScale = 0f; 所以不能使用Time.deltaTime所以在while循环中使用’Time.realtimeSinceStartup’,我从一个全局脚本中读取主音量变量,玩家可以在0-1之间设置游戏,所以说我读了0.6并且我想要在2秒内将音量降低到0我如何获得百分比以保持减少音量? 这是我的代码.. private IEnumerator VolumeDown () { float volumeIncrease = globalVarsScript.musicVolume; float volumePercentage = ??; float newLerpEndTime = Time.realtimeSinceStartup + 2f; while (Time.realtimeSinceStartup < newLerpEndTime) { audio.volume = volumeIncrease; volumeIncrease -= volumePercentage; yield return null; } } 对不起,我只是无法获得’volumePercentage’ 谢谢。

浮点算法 – 双类型的模算子

所以我试图找出为什么模运算符返回如此大的exception值。 如果我有代码: double result = 1.0d % 0.1d; 它会得到0.09999999999999995的结果。 我期望值为0 注意使用除法运算符不存在此问题 – double result = 1.0d / 0.1d; 将得到10.0的结果,意味着余数应为0 。 让我说清楚:对于存在错误我并不感到惊讶,我很惊讶这个错误与游戏中的数字相比非常大 。 0.0999~ = 0.1和0.1与0.1d处于同一数量级,距离1.0d仅一个数量级。 它不像你可以将它与double.epsilon相比,或者说“如果它的<0.00001差异则相等”。 我已经在StackOverflow上阅读了这个主题,在下面的post中有 两 三个 ,其中包括。 任何人都可以建议解释为什么这个错误如此之大? 任何建议,以避免将来遇到问题(我知道我可以使用十进制,但我关心的是性能)。 编辑:我应该特别指出,我知道0.1是一个无限重复的二进制数字序列 – 这与它有什么关系吗?

为什么“dtoa.c”包含这么多代码?

我将是第一个承认我对低级编程的整体知识有点稀疏的人。 我理解许多核心概念,但我不会定期使用它们。 话虽如此,我对dtoa.c需要多少代码感到非常震惊。 在过去的几个月里,我一直在使用C#进行ECMAScript实现,而且我一直在减慢填充引擎中的漏洞。 昨晚我开始研究Number.prototype.toString ,它在ECMAScript规范 (pdf)的 15.7.4.2节中描述。 在第9.8.1节中,注3提供了到dtoa.c的链接,但我正在寻找挑战,所以我等待查看它。 以下是我提出的建议。 private IDynamic ToString(Engine engine, Args args) { var thisBinding = engine.Context.ThisBinding; if (!(thisBinding is NumberObject) && !(thisBinding is NumberPrimitive)) { throw RuntimeError.TypeError(“The current ‘this’ must be a number or a number object.”); } var num = thisBinding.ToNumberPrimitive(); if (double.IsNaN(num)) { return new StringPrimitive(“NaN”); } else […]

c#和javascript中的IEEE 754浮点运算舍入误差

我刚读了一本关于javascript的书。 作者提到了IEEE 754标准中的浮点算术舍入误差。 例如,添加0.1和0.2会产生0.30000000000000004而不是0.3。 所以(0.1 + 0.2) == 0.3返回false。 我也在c#中重现了这个错误。 所以这些是我的问题是: 这种错误多久发生一次? c#和javascript中的最佳实践解决方法是什么? 哪些其他语言有相同的错误?

模数运算如何与浮点数据类型一起使用?

我试图找出浮点数据类型的简单模数运算。 float a=3.14f; float b=10f; result=a%b; 我得到结果= 3.14 另一个使用十进制数据类型 decimal p=10; decimal q=40; result=p%q; 得到答案= 20。 我不明白模数是如何工作的?