首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

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

讨论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满足方程,但是不满足题意了。

热点排行