【发布时间】:2021-05-09 03:12:09
【问题描述】:
我正在用 C 编写一个小计算器来准备考试。 我知道 double 比 float 更精确,因为它为指数保留 11 位,为有效数保留 53 位。 当涉及到整数时,我可以执行以下操作来捕获上溢/下溢。
int sum(int a, int b, int *res){
if((b > 0) && (a > INT_MAX + b)){
return OVERFLOW_ERROR;
}
else if((b < 0) && (a < INT_MAX + b)){
return UNDERFLOW_ERROR;
}else {
*res = a + b;
}
return (EXIT_SUCCESS);
}
当涉及到双倍时,如果数字太高,控制台会给你“inf”或“-inf”,无论如何这都不算太糟糕。 AFAIK,浮点数溢出,当它们失去精度时
所以,我的问题是,您如何处理精度损失?你能让它们“精确”吗? 他们什么时候会失去精度?
【问题讨论】:
-
使浮点数始终精确需要无限量的 RAM。
-
浮点计算总是“丢失精度”。
-
其中一个可能会有所帮助:google.com/search?q=floating+point+precision
-
精度是指有效数字中的位数——它们可以表示值的精细度。准确度是接近理想结果。您的计算可能会失去准确性,但它们不会失去精度,除非您转换为不太精确的格式,或者您的计算机坏了,或者您在指数范围的边缘附近进行计算,因此低位低于可表示的值。
-
大多数浮点算法的设计都是为了容忍一些精度损失,而且大多数都无法避免。在有限的情况下,可以特别小心地使用浮点数进行精确计算。这不太可能是您想要学习的偶然使用浮点的课程。此外,硬件通常允许为浮点异常启用陷阱,因此您可以为产生不精确结果的操作启用陷阱。对此的软件支持并不总是很好。即使它可用,启用它也可能会导致程序的其他部分出现陷阱。