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.

天哪,这就解决了.

posted @   zjh6  阅读(14)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示