注册 登录
编程论坛 C++教室

关于以指数形式表示的浮点运算问题

hffjhhh 发布于 2020-07-07 22:37, 2300 次点击
以下这段代码中关于变量d。书上说是将3.33e+23左边第24个数加上1。
但问题是变量c是float类型,应该无法精确到第24位才对,所以怎么会将3.33e+23左边第24个数加上1呢?
为什么不是在float的取值范围内加1呢?这样最终的打印结果应该是1才对。可是结果却打印0。
程序代码:
#include<iostream>
int main(){
    using namespace std;
    float c=3.33e+23;
    float d=c+1;
    cout<<"d-c="<<d-c;
    return 0;
}
5 回复
#2
rjsp2020-07-08 08:59
怎么听得我稀里糊涂的呀,精确取值范围 是两个无关的概念。

先不谈C/C++。
在数学上,假如有个数是 3.33e+10,假设表示精度是 1e+8。
那么 3.33e+10 + 1 难道不是 33300000001,但因为表示精度只有 1e+8,所以其值仍然为 3.33e+10 ?
按照你“为什么不是在float的取值范围内加1呢”的说法,你是想因为表示精度只有 1e+8,所以 3.33e+10 + 1 应该变为 3.33e+10 + 1e+8 ?
#3
hffjhhh2020-07-08 11:53
以下是引用rjsp在2020-7-8 08:59:03的发言:

怎么听得我稀里糊涂的呀,精确 和 取值范围 是两个无关的概念。

先不谈C/C++。
在数学上,假如有个数是 3.33e+10,假设表示精度是 1e+8。
那么 3.33e+10 + 1 难道不是 33300000001,但因为表示精度只有 1e+8,所以其值仍然为 3.33e+10 ?

由于表示精度是1e+8。表示精度是9位数,所以应当在第9位加1,那么 3.33e+10 + 1 应该是 333000001,也就是将333000000+1。而不是33300000000+1。
我是这样理解的。
#4
牧人马2020-07-08 15:59
float在1e+8的时候已经不行了吧,输出一下显示a=b了
程序代码:

#include<iostream>
using namespace std;
int ch(float x)
{
    int count = 0;
    while (x > 1.0 && fabs(x - 1.0) > 1e-6)
    {
        x /= 10;
        count++;
    }
    return count;
}
int main(void)
{
     float a = 1.23e+8;
     float b = a+1;
    if (a < b && fabs(a - b) > 1e-6)
        cout << "a<b" << endl;
    else if (a > b&& fabs(a - b) > 1e-6)
        cout << "a>b" << endl;
    else
        cout << "a=b" << endl;
    cout <<"a位数="<< ch(a)<<endl;
    cout << "b位数="<<ch(b) << endl;
    cout << "b-a=" << b - a << endl;

}
#5
lin51616782020-07-08 17:35
有效数字意思是 前面几个数字有效
换一个角度就是 后面的数字无效
能理解到这个角度 那你的疑问就能得到解答了
#6
lin51616782020-07-08 17:36
顺便说一下 这个完全和有没有使用指数形式没有关系
指数只是表示一个浮点数的方法而已
你换一个表示方法结果完全是一样的
1