双精度/浮点数与精确值进行比较

时间:2016-12-06 07:42:15

标签: c++ floating-point comparison

关于浮点数比较,有大量文件和讨论。但对我来说,目前尚不清楚是否可以始终保证数字的直接比较适用于所有编译器和平台?

double x = 1.;
if (1. == x)
{
   //do something
}

我们总是会进入if区块吗?

编辑:

这里的比较是正确的(总会有效)?这一个?:

double x = 1.;
if (std::abs(1. - x) < std::numeric_limits<double>::epsilon())
{
   //do something
}

2 个答案:

答案 0 :(得分:2)

是的,这样的直接比较 - 没有干预操作 - 将永远有效。为浮点文字存储的位模式是浮点系统可以表示的最接近的位模式(几乎总是IEEE-754)。所以测试1.0 == 1.0将始终有效,因为位模式是1.0;并且0.3 == 0.3 总是有效,因为在两种情况下,位模式 - 尽管不完全是0.3 - 是最接近可表示的数字,为0.3。

至于epsilon的东西,远离机器epsilon直到你真正知道它代表什么以及它是什么。机器epsilon是相对的,而不是绝对的;并使用它来比较“足够接近”需要了解各种操作可以引入多少错误。有趣的是,在您的特定情况下,两个测试实际上是相同的:只有1.0才会通过测试。

答案 1 :(得分:0)

如果您有两个确切的浮点值,则不必担心比较它们可能会违背您的预期。问题是你怎么知道你的价值观是准确的?

对于提供的示例,您可以非常确信true将评估为 <form method="post" action="edit_team.php"> <?php error_reporting(0); //session_start(); include 'database-config.php'; $selectquery = "SELECT * FROM `register_team`" ; $group_result = mysql_query($selectquery, $conn); $a=0; while ($container_id_record = mysql_fetch_assoc($group_result)) { echo "<tr class='gradeA odd' role='row'><td class='sorting_1'>" . $a . "</td><td>" . $container_id_record['team_name'] . "</td><td>" .$container_id_record['team_coach']. "</td><td>" . $container_id_record['team_manager'] . "</td><td>" . $container_id_record['team_contact'] . "</td><td>". $container_id_record['team_email']. "</td><td> <a href = 'edit-team.php/'.$container_id_record['team_name_coach']><i class='fa fa-edit edit' ></i></a></td> <td><i class='fa fa-trash delete' title='". $container_id_record['team_name_coach']. "'></i></td></tr>"; } ?> - 我个人不会考虑支持任何未通过该测试的平台。然而,有可能逐渐复杂化你的榜样,而无法确定你应该在何时停止依赖比较的结果。