Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Computer science 分流底流_Computer Science_Divide By Zero_Underflow - Fatal编程技术网

Computer science 分流底流

Computer science 分流底流,computer-science,divide-by-zero,underflow,Computer Science,Divide By Zero,Underflow,为什么除法下溢只有在除数远小于被除数的情况下才会发生,而无论被除数的大小,它不应该在分母足够接近零时发生吗 如果舍入结果具有指数,则会发生下溢异常 它太小,无法使用的浮点格式表示 结果呢 这意味着当被除数和除数的比率小到足以超过浮点格式的精度时,而不是依赖于特定值(如epsilon)时,就会发生错误 当分母接近零时,假设分子为非零,除法的结果将接近无穷大。当分子接近零时,假设分母非零,结果接近零。当该值足够小时,将发生一个错误 如果分子和分母的值非常接近,即使它们非常小,也可以得到有用的结果,因

为什么除法下溢只有在除数远小于被除数的情况下才会发生,而无论被除数的大小,它不应该在分母足够接近零时发生吗

如果舍入结果具有指数,则会发生下溢异常 它太小,无法使用的浮点格式表示 结果呢

这意味着当被除数和除数的比率小到足以超过浮点格式的精度时,而不是依赖于特定值(如epsilon)时,就会发生错误

当分母接近零时,假设分子为非零,除法的结果将接近无穷大。当分子接近零时,假设分母非零,结果接近零。当该值足够小时,将发生一个错误

如果分子和分母的值非常接近,即使它们非常小,也可以得到有用的结果,因此非常小的分子不一定会导致下溢

示例

在C#中,ε是1.401298E-45

ε/ε==1.0f

即使分子非常非常小,结果仍然是有效的浮点

现在,如果你想尝试这样的事情:

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)