C++;浮点异常;没有 ./ 运算符

Posted

技术标签:

【中文标题】C++;浮点异常;没有 ./ 运算符【英文标题】:C++; Floating Point exception; Without ./ operator 【发布时间】:2017-09-30 20:05:09 【问题描述】:

以下示例来自 OpenCv 文档[1]。

Mat H(100, 100, CV_64F);
for(int i = 0; i < H.rows; i++)
    for(int j = 0; j < H.cols; j++)
        H.at<double>(i,j)=1./(i+j);

这工作得很好。但在最后一行什么是 ./ 运算符?如果我用 / 替换它,它会给我浮点异常。

所以,在这两种情况下,当 i 和 j 为 0 时,我们都有无穷大;那么为什么我们会在第二种情况下得到浮点异常呢?

[1]http://docs.opencv.org/trunk/d3/d63/classcv_1_1Mat.html

【问题讨论】:

请提出对此问题的改进建议。谢谢 如果你知道了,我可以删除我的答案,这样你就可以删除你的帖子了。只要说出这个词。 @StoryTeller 我认为这是一个很好的答案,请不要删除它。这将有助于社区。我正在等待更多的答案。为什么要删除它(我只是好奇)? 如果您想删除您的问题,我的帖子会阻止它,因为它已被投票。所以只是想给你一个选项,如果这会吸引大量的反对票。 ***.com/a/12617540 【参考方案1】:

./ 不是运算符。点与1 绑定,使其成为双常量。相当于这样:

1.0 / (i+j+1)

只有一点点。

当您省略点时,表达式将使用整数算术进行计算,除0, 0 之外的所有条目均为零。

【讨论】:

鲜为人知的是 /。运营商,它会开源您的网站。【参考方案2】:

. 字符是 1. 双字面值的一部分。 / 是算术运算符,因此右侧表达式变为:

1. / (i+j+1);

结果是一个 double 类型的值。 省略. 字符使其成为1 的整数文字,表达式变为:

1 / (i+j+1);

其中两个操作数都是整数值,结果是整数值。 C++ 代码中的空格对编译器没有影响。出于可读性原因,该语句应在适当的地方包含空格:

H.at<double>(i,j) = 1. / (i+j+1);

【讨论】:

以上是关于C++;浮点异常;没有 ./ 运算符的主要内容,如果未能解决你的问题,请参考以下文章

全局关闭 C++ 新运算符异常

C++ 隐式生成的赋值运算符的异常安全性

为啥C++里面浮点与整数相乘的结果跟在计算器里的不一样呢?浮点我选的float

定点数学比 armv7-a 上的浮点运算快吗?

为啥 nvprof 没有浮点除法运算的指标?

使用整数运算的浮点加法