【发布时间】:2021-02-12 20:59:56
【问题描述】:
如果用户输入一个不等于 0 的数字“n”(整数),我的程序应该检查分数 1/n 在小数点后是否有无限或有限的数字。例如:对于n=2,我们有1/2=0.5,因此我们有小数点后一位。我对这个问题的第一个解决方案是:
int n=1;
cin>>n;
if((1.0/n)*n==1)
{
cout<<"fixed number of digits after decimal point";
}
else cout<<"infinite number of digits after decimal point";
由于计算机无法存储像1/3 这样的无限数字,我预计(1/3)*3 不会等于1。我第一次运行程序时,结果是我所期望的,但是当我今天运行程序时,对于n=3,我得到了输出(1/3)*3=1。我对这个结果感到惊讶并尝试了
double fraction = 1.0/n;
cout<< fraction*n;
这也返回了 1。为什么行为不同,我可以让我的算法工作吗?如果我不能让它工作,我将不得不检查n 的除数是否只有 1、2 和 5,我认为这将更难编程和计算。
我的 IDE 是 Visual Studio,因此我的 C++ 编译器是 VC。
【问题讨论】:
-
仅仅因为计算机不能存储无限精度并不意味着它不能以有限精度获得数学上正确的结果(但当然不能保证)。另外,您似乎假设浮点数存储为小数,而它们不是(通常)。你将不得不检查除数。这是问题的自然解决方案。
-
乘法 `n * (1/n)` 不会以无限精度执行。最简单的方法是按照您的建议检查是否存在除 2 和 5 之外的其他除数
-
它非常接近重复但不准确。但是,如果您阅读本文,您将了解很多需要了解的内容 - stackoverflow.com/questions/588004/… 基本上您无法通过使用浮点数学来回答这个问题。
-
@Yunnosch 我知道 OP 假设除法
1/n的精度是有限的,然后是乘法的完美选择。这就是为什么我坚持乘法。我可能不清楚,或者 OP 的解释有误。 -
@RichardCritten 感谢您分享这篇文章。
标签: c++ math arithmetic-expressions