鱼C论坛

 找回密码
 立即注册
查看: 1756|回复: 6

为什么double除以double最后输出会是0.0000

[复制链接]
发表于 2022-9-12 19:58:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        double T[M],V[M];
        double R[M];
        for (int i = 0;i<=M;i++) /*这里是输入数据*/
        {
                scanf("%lf%lf",&T[i],&V[i]);
                R[i] = V[i] / T[i];
        }
for (i = 0;i<=M-1;i++)
        {
                printf("%lf %lf %lf\n",T[i],V[i],R[i]);
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-12 20:53:25 From FishC Mobile | 显示全部楼层
你咋输入的数据?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-12 21:11:45 | 显示全部楼层
额,你试试我帮你改的这个代码?
#include<stdio.h>
#define M 1
int main(void)
{
        double T[M],V[M];
        double R[M];
        for (int i = 0;i<M;i++) /*这里是输入数据*/
        {
                scanf("%lf %lf",&T[i],&V[i]);
                R[i] = V[i] / T[i];
        }
        for (int i = 0;i<M;i++)
        {
                printf("%lf %lf %lf\n",T[i],V[i],R[i]);
        }

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-12 21:12:47 | 显示全部楼层
记得输入数据时输完一个数据打个空格再输下一个数据比如这样:2.5 3.6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-12 21:33:05 | 显示全部楼层
我给你回复,你给我设置一个最佳答案谢谢,我冲榜好吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-12 21:34:09 | 显示全部楼层
本帖最后由 编程追风梦 于 2022-9-12 21:35 编辑
编程追风梦 发表于 2022-9-12 21:33
我给你回复,你给我设置一个最佳答案谢谢,我冲榜好吧

这是C语言的long double输出后出现了0.0000的问题
int main(void) {

    long double bug=5.34e-7;
    printf("%Lf or %Le\n", bug, bug);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-12 21:35:16 | 显示全部楼层
编程追风梦 发表于 2022-9-12 21:34
这是C语言的long double输出后出现了0.0000的问题

这段代码如果放在【微软的VC编译器(MSVC)】里跑是可以显示正常结果的。
但是放在MinGW跑就会出现0.0000的异常结果。

造成这个问题的原因就是MinGW虽然不需要任何第三方的运行库,但是需要微软的运行库,其中包括了MSVCRT.DLL以及其他的微软C语言运行库。所以GCC编译后的程序还是运行在MSVC运行库上的程序。
同时又由于32位的MSVC并不支持更高精度的double类型(在32位的MSVC中long double与double的精度均为8字节=64bit),而GCC在32位的操作系统中long double是12字节=96bit,64位更是16字节=128bit,所以就出现了不兼容的问题。

简单来讲就是如果你用MSVC跑代码,不管写double还是long double,他们都只占用64bit。所以他俩是一样的,所以运行后不会出错。
而MinGW的double是64bit的,而long double是128bit(long double其实表示 80bit 扩展精度浮点数。但为了字节对齐所以就分配成了128bit,多余的bit全部填 0)。
而MinGW实际上还是依靠在MSVC上的,所以使用MinGW跑long double的时候就出现问题了,MSVC只支持64bit的long double,而MinGW的long double是128bit的。所以出现了冲突,不兼容。直接给你打印0.00000

解决办法:
在头文件#include <stdio.h>上面加入#define printf __mingw_printf
也就是全局使用MinGW标准的printf函数进行输出。
或者在函数名称前加上__mingw_(例如__mingw_printf)

或者在使用MinGW的时候不用long double,改用double就可以正常打印输出。
MinGW的double是64bit的,是可以被MSVC所支持的。
而long double是128bit的是不被支持的。
————————————————
版权声明:本文为CSDN博主「Rain:.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43019319/article/details/108981302
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 18:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表