Computer science 分流底流
为什么除法下溢只有在除数远小于被除数的情况下才会发生,而无论被除数的大小,它不应该在分母足够接近零时发生吗 如果舍入结果具有指数,则会发生下溢异常 它太小,无法使用的浮点格式表示 结果呢 这意味着当被除数和除数的比率小到足以超过浮点格式的精度时,而不是依赖于特定值(如epsilon)时,就会发生错误 当分母接近零时,假设分子为非零,除法的结果将接近无穷大。当分子接近零时,假设分母非零,结果接近零。当该值足够小时,将发生一个错误 如果分子和分母的值非常接近,即使它们非常小,也可以得到有用的结果,因此非常小的分子不一定会导致下溢 示例: 在C#中,ε是1.401298E-45 ε/ε==1.0f 即使分子非常非常小,结果仍然是有效的浮点 现在,如果你想尝试这样的事情:Computer science 分流底流,computer-science,divide-by-zero,underflow,Computer Science,Divide By Zero,Underflow,为什么除法下溢只有在除数远小于被除数的情况下才会发生,而无论被除数的大小,它不应该在分母足够接近零时发生吗 如果舍入结果具有指数,则会发生下溢异常 它太小,无法使用的浮点格式表示 结果呢 这意味着当被除数和除数的比率小到足以超过浮点格式的精度时,而不是依赖于特定值(如epsilon)时,就会发生错误 当分母接近零时,假设分子为非零,除法的结果将接近无穷大。当分子接近零时,假设分母非零,结果接近零。当该值足够小时,将发生一个错误 如果分子和分母的值非常接近,即使它们非常小,也可以得到有用的结果,因
float max = 3.40282347E+38f;
/// underflow, denominator will be 0.0f
float denominator = epsilon / max;
分母
的顺序为1e-83。由于83远远超过最大单精度浮点指数,该值将被限制为零。这就是底流发生的地方
/// generates a divide-by-zero error.
float result = 10 / denominator;
这将生成一个被零除而不是无穷大的除法,因为存储在分母中的中间结果在用于第二个操作之前首先被钳制为0
您是得到下溢还是被零除取决于编译器、您的使用和parenthisis的顺序等
例如,在C#中:
以及
(10f / float.Epsilon) / float.MaxValue
给出20971522.0f
但是,数学上等价的表达式:
10f / (float.Epsilon / float.MaxValue)
给无限 我想我还是错过了一些东西。如果使用数字,下面的情况不是真的吗:假设.001超出范围,并且它=0;1/.001=1/0=被零除,.001/.001=0/0=被零除,.01/.001=.01/0=被零除。区别是什么?1/0.001==1000;当分母收缩时,结果接近无穷大,而不是零。也许我误解了这个问题?更可能的是,我不了解有关分流的某些内容。我假设一台计算机不能处理.001,并将其四舍五入为0,即.001=0,因此如果我尝试除以1/.001,因为计算机将.001视为0,这与除以1/0相同,这将是一个错误(无论分子是什么)。那不是真的吗?我想我开始明白了。这些例子真的很有帮助。我想澄清一下,这是第二轮分组,对吗?这意味着整个过程看起来像10/(ε/max)=除以底流==除以零。@David如果传入一个非零值,例如0.001,该值将用于立即的两项计算。因为除数是0.001,所以不会被零除,因为它不是零。该结果可能被钳制为零,导致下溢,如果该零被用作除数,您将得到一个被零除的错误。但是,除以ε(在您的示例中为0.001)永远不会立即导致除以零的错误。
10f / (float.Epsilon / float.MaxValue)