c - 为什么输出-1.#IND00 会出现浮点错误?

标签 c

printf("The Angle A Is: %f", (acos((b*b + c*c - a*a)/2*b*c)*180/3.14159265359));

这是一个简单的程序,如果输入了边 a、b、c,则返回角度 A。

我已经检查了三角形是否可能。

if((a+b) <= c || (b+c) <= a || (c+a) <= b)
    return 0;

我得到了一些输入的正确输出。对于 1 1 1我得到60 .

但是对于输入 7 7 7我得到-1.#IND00而不是 60我应该得到。

现在我通过阅读another answer才知道它代表不确定的值(特别是除以零的非零数字),但这里情况并非如此。

那么为什么我会收到此错误?

这是完整的程序:

int main()
{
    float a, b, c;

    printf("Enter The Sides of The Triangle(a, b, c): ");
    scanf("%f %f %f", &a, &b, &c);

    if((a+b) <= c || (b+c) <= a || (c+a) <= b)
    {
        printf("Triangle Not Possible.");
        return 0;
    }

    printf("The Angle A Is: %f", (acos((b*b + c*c - a*a)/2*b*c)*180/3.14159265359));
}

最佳答案

你缺少一些括号。而不是编写 acos((b*b + c*c - a*a)/2*b*c)
编写acos((b*b + c*c - a*a)/(2*b*c))。否则,b*c 最终会成为分数的分子,而不是分母,并且您会尝试获取不可能数字的反余弦。

一般来说,当你遇到这样的问题时,简化和分解代码会有所帮助。如果acos返回一个意外的值,那么它一定有一个不正确的参数。因此,计算 acos 的参数,将其放入变量中,打印那个,确保其正确,然后继续。

关于c - 为什么输出-1.#IND00 会出现浮点错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57831615/

相关文章:

c - C 中的简单结构 - 需要帮助

c - 在 C 中重命名 .dat 文件时权限被拒绝

c - 用于编译 Allegro5 c 程序的 Makefile

c - 具有作用域和全局变量的 Malloc

C - free() 没有释放整个数组

c - 为了保持一致性,我应该包含未使用的参数吗?

c - main 函数内的 extern 存储类变量

c# - 将类从 C#(AVL 树节点)转换为 C

c++ - 在所有架构上 sizeof(float) 总是等于 sizeof(int) 吗?

c - 函数未在此范围内声明