读书人

讨论c/c++计算小数的精度有关问题

发布时间: 2013-12-19 00:33:34 作者: rapoo

讨论c/c++计算小数的精度问题
求出所有100以下整数与一位小数相乘等于相加的浮点数
这个有Bug浮点数计算时精度会出现误差

除非使用非常精确的类型或限制浮点的位数

比如


cout.precision这个让我非常讨厌,一个伪限制精度
[解决办法]
一般都是两数相减再用fabs取绝对值,看是否小于一个非常小的数字,如果是,就视作相等。
[解决办法]
浮点数,有误差是件很正常的事情、。。
[解决办法]
cout.precision是用来限制显示精度的
浮点数不能精确表示绝大部分小数,这是浮点数的定义格式决定的,如果楼主为此责怪cout,我只能认为楼主既不懂什么叫浮点数也不懂什么叫cout
[解决办法]
题目既然限定一位小数,就不是让你用浮点来做的。。。。扯浮点数的计算误差干什么
[解决办法]
多乘10,然后自己加个小数点
[解决办法]
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。

[解决办法]
LS每个人说的都是对的。

# include <stdio.h>

int main()
{
int a, b, c;
for (a = 0; a < 100; a++)
{
for (b = 0; b < 100; b++)
{
for (c = 1; c <= 9; c++)
{
if (a * 10 + b * 10 + c == a * (10 * b + c))
printf("%d + %d.%d == %d * %d.%d\n", a, b, c, a, b, c);
}
}
}

return 0;
}

// let a 0-100
// let b.c 0.0-100.0 (let c 1-9)
// a + b.c == a * b.c
// 10 * (a + b.c) == 10 * a * b.c
// 10a + 10b + c == a * (10b + c)

3 + 1.5 == 3 * 1.5
6 + 1.2 == 6 * 1.2
11 + 1.1 == 11 * 1.1

[解决办法]

#include <cmath>
#include <iostream>
int main()
{
using std::cout;
using std::endl;
unsigned int a = 0;
double b;
double temp;


while (a <= 100)
{
b = 0;
while (b < 100)
{
temp = 0.1;
while (temp < 1)
{
if (fabs((a + b + temp) - (a * (b + temp))) < 0.000001)
cout << a << '\t' << b << '+' << temp << endl;
temp += 0.1;
}
b++;
}
a++;
}
}


这是基于LZ的代码和1L的提示所做的修改,不幸的是
21+1
31+0.5
61+0.2
111+0.1
还是逃不出精度的问题

[解决办法]

#include <cmath>
#include <iostream>
int main()
{
using std::cout;
using std::endl;
unsigned int a = 0;
double b;
double temp;
while (a <= 100)
{
b = 0;
while (b < 100)
{
temp = 0.1;
while (fabs(temp - 1) > 0.000001)
{
if (fabs((a + b + temp) - (a * (b + temp))) < 0.000001)
cout << a << '\t' << b << '+' << temp << endl;
temp += 0.1;
}
b++;
}
a++;
}
}

不好意思,少了个fabs。

[解决办法]
既然限定一位小数
就不用浮点了
[解决办法]
精确计算用定点数计算即可
[解决办法]
也可以用10倍的数值,表示1位小数。

比如
1 表示 0.1
11 表示 1.1

for(int i=0;i<100;i++)
for(int j=0;j<1000;j++)
{
if(i+j == i*j)......
}


[解决办法]
x + y/10 = x*y/10
x*y - 10*x - y = 0
(x-1)(y-10) = 10
(x-1,y-10)={(1,10),(2,5),(5,2),(10,1)}
(x,y/10)={(2,2),(3,1.5),(6,1.2),(11,1.1)}

why need code
[解决办法]
2,2满足方程,但是不满足题意了。

读书人网 >C++

热点推荐