gpt4 book ai didi

C++浮点减法似乎没有发生

转载 作者:太空宇宙 更新时间:2023-11-04 13:05:13 24 4
gpt4 key购买 nike

我正在尝试为加法(以及其他操作)创建溢出检查,虽然我为整数和长整数编写的单元测试运行良好,但我在尝试将其扩展到 float 时遇到了一些问题。问题的本质在以下代码中表达:

 1 #include "gtest/gtest.h"
2 #include <math.h>
3 #include <cmath>
4 #include <cfloat>
5 #include <float.h>
6 #include <limits>
7
8
9 class Test_FloatPfa : public ::testing::Test
10 {
11 public :
12
13 virtual void SetUp(){}
14 virtual void TearDown(){}
15 };
16
17
18 ///////////////////////////////////Basic operator tests above, overflow tests below////////////////
19
20 TEST_F(Test_FloatPfa, checking_for_FLOAT_sum_overflow)
21 {
22 float numberOne = std::numeric_limits<float>::max();
23 float numberTwo = 1.0;
24 ASSERT_TRUE(numberTwo > numberOne - std::numeric_limits<float>::max());
25 }
26
27 TEST_F(Test_FloatPfa, checking_for_FLOAT_sum_overflow2)
28 {
29
30 float number1 = 1.0;
31 float number2 = std::numeric_limits<float>::max();
32
33 ASSERT_EQ ( number2, std::numeric_limits<float>::max() );
34 printf("number1, number2 and limit -1 is: %f \n, %f \n, %f \n",number1, number2, std::numeric_limits<float>::max() -1);
35 ASSERT_TRUE (number2 > std::numeric_limits<float>::max() - number1 );
36 }
37
38
39

给出以下输出:

Running main() from gtest_main.cc
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from Test_FloatPfa
[ RUN ] Test_FloatPfa.checking_for_FLOAT_sum_overflow
[ OK ] Test_FloatPfa.checking_for_FLOAT_sum_overflow (0 ms)
[ RUN ] Test_FloatPfa.checking_for_FLOAT_sum_overflow2
number1, number2 and limit -1 is: 1.000000
, 340282346638528859811704183484516925440.000000
, 340282346638528859811704183484516925440.000000
/home/adam/Projects/git/pfa-cpp-lib/PFALib/test/TEst_for_SO.cpp:35: Failure
Value of: number2 > std::numeric_limits<float>::max() - number1
Actual: false
Expected: true
[ FAILED ] Test_FloatPfa.checking_for_FLOAT_sum_overflow2 (0 ms)
[----------] 2 tests from Test_FloatPfa (0 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (1 ms total)
[ PASSED ] 1 test.
[ FAILED ] 1 test, listed below:
[ FAILED ] Test_FloatPfa.checking_for_FLOAT_sum_overflow2

1 FAILED TEST

它似乎无法识别从最大浮点值减一,导致不等式的计算结果为 false。 write 语句确认最大值减一不会被计算为小于最大值本身。

提前感谢您提供的任何见解。

最佳答案

你的程序运行正常,浮点值没有溢出。因为您的第一个数字四舍五入为零。

尝试将第一个数字设置为 1e30

也尝试编写代码:

(1e21+1e0)-1e21=0 但 1e21-1e21+1e0=1e0

关于C++浮点减法似乎没有发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42768288/

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