【问题标题】:How to round in functions如何在函数中舍入
【发布时间】:2022-11-17 14:50:28
【问题描述】:
void isRight(float sideA, float sideB, float sideC){
float aSquared = sideA * sideA;
float bSquared = sideB * sideB;
float cSquared = sideC * sideC;
round(aSquared);
round(bSquared);
round(cSquared);

if (aSquared + bSquared == cSquared || cSquared + bSquared == aSquared || aSquared + cSquared == bSquared){
    cout << "This is a right triangle" << endl;
}
}
int main() {
float sideA, sideB, sideC;

cout << "Enter the lengths of the three sides of a triangle -- ";
cin >> sideA >> sideB >> sideC;    

    
    isRight(sideA,sideB,sideC);
   
}

}

我有这个程序可以检查我的三角形的边并判断它是否是直角三角形。当我有像 3 5 4 这样的整数时它会工作,它会给我一个消息,它是一个直角三角形。但是如果输入 1 1.4142 1,它不会给我消息,这很奇怪,因为 1,4142 的平方等于 2,这与 1 和 1 相同。有人能明白为什么会这样吗?我猜是因为它没有四舍五入,但我有四舍五入的功能

【问题讨论】:

  • round(x);没有作用,你要x = round(x);
  • 你误解了 round 函数的工作原理,它回报四舍五入的价值。所以如果你想使用一个四舍五入的值,那么你需要像aSquared = round(aSquared);float aSquared = round(sideA * sideA);这样的东西。这个版本round(aSquared); 什么都不做,因为它忽略了返回值。
  • 那就是说我不认为 round 函数是你问题的答案,你需要类似下面的答案。而且您需要了解浮点运算本质上是不准确的。

标签: c++


【解决方案1】:

这是因为浮点精度损失而发生的。

C++ 内置浮点类型的精度是有限的。 double 通常实现为 IEEE-754 double precision,这意味着它具有 53 位尾数(“值”)精度、11 位指数精度和 1 位符号位。

要解决此问题,您可以执行以下操作而不是==

bool approximatelyEqual(float a, float b, float epsilon)
{
    return fabs(a - b) <= ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool definitelyGreaterThan(float a, float b, float epsilon)
{
    return (a - b) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool definitelyLessThan(float a, float b, float epsilon)
{
    return (b - a) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

注意:这里epsilon是浮点数容错值(如0.000001、0.0000001等)

您可以阅读 What Every Programmer Should Know About Floating-Point Arithmetic 以获取有关浮点格式及其不准确性的更多信息,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    相关资源
    最近更新 更多