问题1:除以整数的除数会失去精度吗?
int a=M*N,b=N;//M and N are random non-zero integers.
float c=float(a)/b;
if (c==M)
cout<<"accurate"<<endl;问题2:传递浮点值会失去精度吗?
float a=K;//K is a random float;
if (a==K)
cout<<"accurate"<<endl;发布于 2015-11-19 05:41:24
问题1:除以整数的除数会失去精度吗?
是。我用下面的程序计算出一些数字:
#include <iostream>
#include <climits>
int main()
{
int M = 10;
int N = 7;
int inaccurateCount = 0;
for (; M < INT_MAX && inaccurateCount < 10; ++M )
{
int a = M*N;
float c = float(a)/N;
if ( c != M )
{
std::cout << "Not accurate for M: " << M << " and N: " << N << std::endl;
inaccurateCount++;
}
}
return 0;
}这是输出:
Not accurate for M: 2396747 and N: 7
Not accurate for M: 2396749 and N: 7
Not accurate for M: 2396751 and N: 7
Not accurate for M: 2396753 and N: 7
Not accurate for M: 2396755 and N: 7
Not accurate for M: 2396757 and N: 7
Not accurate for M: 2396759 and N: 7
Not accurate for M: 2396761 and N: 7
Not accurate for M: 2396763 and N: 7
Not accurate for M: 2396765 and N: 7问题2:传递浮点值会失去精度吗?
不,不应该。
发布于 2015-11-19 06:57:55
问题1:除以整数的除数会失去精度吗?
实际上,您询问将一个int转换为一个float是否会失去建议。是的,它通常会做到这一点。在今天,32位(或更宽的)计算机体系结构,一个int存储32位数据:1位符号加31位显着性。float也存储32位数据,但这些数据是:1位符号,8位指数,23位小数部分,cf。IEEE 754单精度浮点格式 (它在16位架构上可能不会失去精度,但我无法检查它)。
根据浮点数的不同,它将被存储在不同的表示形式中,一种是归一化形式,其中小数部分被隐藏的部分加起来,从而得到一个24位的意义。这比存储在int中的要少。
例如,整数01010101 01010101 01010101 01010101 (二进制,仅用于更好的读取的空间)不能表示为float,而不影响精度。以规范化的形式,这将是1,010101 01010101 01010101 01010101 * 2^30。因此,我们在逗号之后有30个有意义的二进制数字,它不能存储在23位(小数部分)中,而不会失去精度。实际的圆形模式定义了如何缩短值。
注意,它并不取决于实际值是否“高”。整数01000000 00000000 00000000 00000000以规范化形式1,000000 00000000 00000000 00000000 * 2^30表示。该数字在逗号之后有零个有效位,并且可以在不丢失精度的情况下存储。
Q2:传递浮点值会失去精度吗?
不是的。
发布于 2015-11-19 07:14:37
问题1:除以整数的除数会失去精度吗?
如果a太大,它可能会丢失精度,否则(如果a足够小,可以精确地表示为浮点数),则不会。当您转换a时,精度的损失可能已经发生了。此外,除法也会降低精度,但有时这些精度损失会相互抵消。
例如,如果N = 8388609和M=5。你有(二进制)尾数100.001,用101个乘积,最后用101000.0000101结束,但是最后两个位将被舍入为零,在(浮动)(N*M)中得到一个错误,但是当你除以5,得到1,000.00和剩余的100,这意味着它应该集合一步,然后返回原来的数字。
问题2:传递浮点值会失去精度吗?
不,它不会失去精确性。但是,您的代码仍可能无法将其识别为准确。
如果K是一个NaN (例如0.0/0.0),那么x也会变成一个NaN --但是NaN不应该(需要)比较相等。在这种情况下,人们可能会争辩说您丢失了精度,我也同意,但是x=K并不会失去精度--您在生成K时已经失去了精度。
https://stackoverflow.com/questions/33795906
复制相似问题