0
点赞
收藏
分享

微信扫一扫

d浮点小问题


float z = 85886696878585969769557975866955695.E0;
//整溢出.
real x = 0x1p-16383;
//不能表示该数.

它是为了支持​​UFCS​​​(通用函数调用语法).​​D兼容C​​​的想法是,当代码有​​不同​​​含义时,不要​​*安静*​​​破坏代码.因此,这些,在D中会​​生成​​​错误消息(尽管​​错误消息​​​还可改进).
那么,​​​ImportC​​可工作吗?

test2.c:
float z = 85886696878585969769557975866955695.E0;
long double x = 0x1p-16383;
//dmd -c test2.c
//不能表示`0x1p-16383`.

第1个与​​ImportC​​​编译的一样.不可表示,截断为0.​​ImportC​​​似乎应接受,如果接受,是否误导用户,这是​​非0​​​?
这是判断问题.

如果​​定义​​​了正确的函数,它可​​安静​​​破坏代码.以下示例在​​C和D​​​中有效(​​导入/包含​​​除外),但​​打印​​出不同的值:

// #include <stdio.h>
import core.stdc.stdio;

int E2(int i)
{
return i;
}

int main()
{
float f = 123.E2;
printf("%f\n", f);
return 0;
}

除了基本的​​C不兼容​​​外,如​​字面​​​不是选项,需要关于​​歧义​​​的警告.
用​​​ImportC​​​编译与​​用D​​​编译​​相同代码​​,却结果不同.真是坑.

real x = 0x1p-16383L;
//这样,就可以了,加个L.

​天哪​​,这就解决了.


举报

相关推荐

0 条评论