gpt4 book ai didi

c# float 取模运算符

转载 作者:行者123 更新时间:2023-12-04 08:37:26 28 4
gpt4 key购买 nike

下面的代码对数字 0.01, 0.02, 0.03, ... , 0.99 运行模数 0.01

var testVals = Enumerable.Range(1, 99).Select(n => double.Parse("0." + n.ToString("D2")));
var moduloTest = testVals.Select(v => v % 0.01).ToList();
(注意:从字符串中解析 double 是有意的,这样对浮点数进行的唯一数学运算就是模数)
我希望这里的 moduleTest 列表包含几个非常接近 0 的浮点值。然而,列表中的许多值都非常接近 0.1。
我知道浮点数学并不精确,并引入了舍入误差,但这里的 0.1 甚至不接近于 0。

最佳答案

I understand that floating point math is not exact, but in many cases here it seems to be not even close.


这里的模数没有增加错误/不精确,只是使先验不精确的影响非常明显。

随着模数的质量实现,没有不精确。见 Is fmod() exact when y is an integer? .
问题在于假设数学与十进制值(如 0.01)的行为总是接近转换为最接近的可表示浮点数的那些值。有限浮点值都是精确的。形成它们的值的操作是“错误”出现的地方——有一些异常(exception),比如模数。
以十六进制或足够的十进制精度(如 17 个有效小数位)打印值通常足以显示预期的 0.01 未编码为浮点数 0.01,而是接近该值的值。对计算结果也执行此操作以获得更深入的了解。
模运算的本质是 sawtooth曲线如绿线 here .
鉴于在 0.01 转换中产生的错误和 / ,(不是模数),OP 值的模数的结果预期正好在不连续性的两侧:大约 0.0 或接近 0.01。

关于c# float 取模运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64734431/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com