| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1067 人关注过本帖
标题:求助 C语言问题。在C语言 123.456×3≠370.368
只看楼主 加入收藏
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
结帖率:97.26%
收藏
已结贴  问题点数:16 回复次数:7 
求助 C语言问题。在C语言 123.456×3≠370.368
求助 C语言问题。
在C语言 123.456×3≠370.368
123.456×3=370.36799999999999999999999
number数据   转字符  char数据时,做了位数限制。

如果,不做限制,一点转换就没有了响应。只能任务管理器里结束进程。或者长按电脑电源。。。
想关机,开始菜单也没有反应。。。。
搜索更多相关主题的帖子: 限制 C语言 结束 进程 数据 
2021-12-03 03:52
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
给运行的代码看看
2021-12-03 09:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:16 
既然是“求助”,那为什么在整个帖子中看不到你的任何提问?全是陈述句。

123.456×3≠370.368
你的这个“123.456”是什么?是C语言范畴中float/double/long double的double,还是数学范畴中的“实数”?但无论是哪个,你这个结论看起来都不正确呀
程序代码:
#include <stdio.h>

int main( void )
{
    if( 123.456*3 == 370.368 )
        puts( "123.456*3 == 370.368" );
    else
        puts( "123.456*3 != 370.368" );
}

如上代码,你编译运行后输出什么?

123.456×3=370.36799999999999999999999
这个看起来你前面两个说的是“double”,后面说的是“实数”,挺别扭的,类似于 1+2不写等于3而写等于洋文的three。
按C语言来写是 123.456×3=370.368
按实数来写是 123.4560000000000030695446184836328029632568359375 × 3 = 370.36799999999999499777914024889469146728515625

number数据   转字符  char数据时,做了位数限制。

如果,不做限制,一点转换就没有了响应。只能任务管理器里结束进程。或者长按电脑电源。。。
想关机,开始菜单也没有反应。。。。
不知所云

------------------------------------------------------------------------------------

浮点数 的本质是 以有限位二进制表达的科学计数法。
以十进制的 123.456 为例,123.456 用二进制表达需要无限多的位,但double是有限的,因此只取前面53个有效数,即 1.1110110111010010111100011010100111111011111001110111 * 2^6(十进制的 123.4560000000000030695446184836328029632568359375)。
在“实数”眼中,给出了 123.456,但存成了 123.4560000000000030695446184836328029632568359375;
在“double”眼中,给出了 123.4560000000000030695446184836328029632568359375 也存成 123.4560000000000030695446184836328029632568359375,“double”看待 123.456 和 123.4560000000000030695446184836328029632568359375 是一模一样的,找不出两者丝毫的差别。同样,370.36799999999999499777914024889469146728515625 和 370.368 在double眼中也是同一个数。

  1.1110110111010010111100011010100111111011111001110111 * 2^6 (十进制的 123.4560000000000030695446184836328029632568359375)
* 1.1000000000000000000000000000000000000000000000000000 * 2^1 (十进制的 3)
--------------------------------------------------------------
= 1.0111001001011110001101010011111101111100111011011001 * 2^8 (十进制的 370.36799999999999499777914024889469146728515625)
2021-12-03 09:33
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
收藏
得分:0 
回复 3楼 rjsp
我想说清楚,可这个论坛,不能上传图片,也不又能上传附件。。。
2021-12-04 00:50
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 4楼 追梦人zmrghy
为什么要贴图,文字形式不好吗?
2021-12-04 10:59
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
收藏
得分:0 
回复 5楼 rjsp
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
2021-12-05 00:53
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
收藏
得分:0 
回复 5楼 rjsp
text_char_number.rar (880.62 KB)
2021-12-05 00:58
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
不要贴图(贴了也不看),也不要贴附件(一大堆不相干的文件,需要别人浪费时间去海里捞针)。

拿你的提问来举例,正常人会这么问:
void number_char(double num ,char *pch)
{
    int i=0, j=0;
    long k=1, zs=0;
    while((int)num > 10*k)
        k *= 10;
    for(i=0; k>=1;i++)
    {
        pch[i] = ((int)num)%(10*k)/k+48;
        k /= 10;
    }
    pch[i]=46;
    for(j=0; j<i; j++)
    {
        zs *= 10;
        zs += pch[j]-48;
    }
    num -= zs;
    while(num > 0.0000001 && i<18)
    {
        num *= 10.0;
        i++;
        pch[i] = ((int)num)/1+48;
        num = num- ((int)num)/1;
    }
}

#include <stdio.h>

int main( void )
{
    char buf[100];
    number_char( 370.368, buf );
    puts( buf );
}
如上代码,实际输出“370.367999999999994后接一段乱码”,如何输出“370.368”?


你的那段 number_char 我不置喙,你现在就是想要一个 shortest round trip 算法是吧?即,你想将 double 转换成字符串,必须能无损的转回来,且又要是最短形式
难!C++可以用 std::to_chars( ……, num, std::chars_format::fixed );
C语言的话,可以用 sprintf( buf, "%.*e", DBL_DIG-1, num ) 先输出最少必须的有效数,然后去掉指数,移动小数点……,这个不难。难点在于当 num 接近 正负DBL_MAX 时,因为缩减到DBL_DIG位会导致值超过正负DBL_MAX,从而导致再转回double时失败(变成正负inf)。是个好问题,可惜我最近忙,你自己在网上搜搜吧
2021-12-07 09:20
快速回复:求助 C语言问题。在C语言 123.456×3≠370.368
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027650 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved