- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有简单的代码:
#include <stdio.h>
int main()
{
//char d[10] = {0x13, 0x43, 0x9b, 0x64, 0x28, 0xf8, 0xff, 0x7f, 0x00, 0x00};
//long double rd = *(long double*)&d;
long double rd = 3.3621e-4932L;
printf("%Le\n", rd);
return 0;
}
在我的 Ubuntu x64 上,它按预期打印 3.362100e-4932。在我的 NetBSD 上它打印 1.681050e-4932
为什么会发生,我该如何解决?我尝试了 clang 和 gcc,结果相同。
我的系统(VirtualBox 5.0 中的虚拟机):
uname -a
NetBSD netbsd.home 7.0 NetBSD 7.0 (GENERIC.201509250726Z) amd64
gcc --version
gcc (nb2 20150115) 4.8.4
clang --version
clang version 3.6.2 (tags/RELEASE_362/final)
Target: x86_64--netbsd
Thread model: posix
仅供引用
/usr/include/x86/float.h
定义为 LDBL_MIN
为 3.3621031431120935063E-4932L
并且这个值大于 printf 结果.
最佳答案
/usr/include/x86/float.h
defines asLDBL_MIN
as3.3621031431120935063E-4932L
And this value is greater than printf result.
LDBL_MIN
是 long double
类型的最小正标准化值。该类型可以表示较小的数字,它们只是次正规的。
我只能推测 NetBSD 问题的性质,但主要有两种可能性:
编译器将您的初始化常量转换为一个次正规数,该数与请求值相距甚远(相对而言)。
这个数字翻译得很好(但结果仍然是次正规的),NetBSD 的 printf()
对于次正规的数字是有问题的,或者至少对于这个数字是这样。
打印的数字是您预期的一半这一事实表明 long double
表示中的(二进制)指数存在问题。考虑到次正规数的 IEEE 格式的详细信息,很容易想象不预期次正规数的 printf()
实现如何将(二进制)指数字段误解为表示小于 1 的指数实际表示的是什么,因此打印一个值是预期值的一半。这是我对正在发生的事情的猜测。
您可能还可以通过打印来区分错误的值和错误的显示情况,比如 rd * 4
。无论哪种方式,这都应该在正常数字的范围内,因此人们会假设特定于次正规数字的 printf()
错误不会影响打印它。
至于如何进行,您有多种选择。我最有可能想到的是:
避免次正规数。这可能不切实际,但至少您可以使用 LDBL_MIN
作为初始化器,而不是使用最接近次正规 long double
的常量。
忽略这个问题。如果您可以确认这是一个显示问题,而不是错误值问题,那么您可能不需要做任何事情来充分满足您的更大目标。
修复 NetBSD 的 C 库。假设问题出在 printf()
中,修复可能不会很大,并且库是开源的,就像系统的其余部分一样。
提交错误报告并等待其他人修复它。如果您需要及时修复,那么这可能不合适,但如果您有时间等待,那么这对您来说几乎不需要付出任何努力。
关于c - NetBSD 长双麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35090322/
我有一个使用 qemu 创建的 NetBSD VM,我正在尝试使用我使用 build.sh 构建的交叉编译工具链编译一个简单的 Hello World.c 程序 NetBSD 源代码附带的脚本。但是,
我有简单的代码: #include int main() { //char d[10] = {0x13, 0x43, 0x9b, 0x64, 0x28, 0xf8, 0xff, 0
我们尝试将虚拟机移植到 Net Bsd 7.0 (amd64) 上。已经成功从 Linux 移植到 Free BSD 和 Open BSD 等。我们在全新标准安装 Net BSD 时遇到了几个问题。
我正在通过阅读 NetBSD 源代码来学习“阅读代码”。 (有兴趣的可以看阅读:开源视角>我在读) 我发现了这个功能: /* convert IP address to a string, but n
正在尝试运行 a C++ program , 我得到分割似乎特定于 NetBSD 的故障。伯特休伯特写了简单的测试程序(在此消息的末尾),事实上,它只在 NetBSD 上崩溃。 % uname -a
我正在编写一个 FastCGI 来为 Web 提供商提供对静态内容的 zlib 压缩,但我在 NetBSD 上遇到了 mmap() 的问题。 #include #ifndef MADV_DONTFO
我编译了原始的 cwm tgz 包(不是 netbsd 包) ./configure make 可以正常工作。用开始cwm后 ./cwm 错误 Shared object "libX11.so.7"
在 NetBSD 系统文件 usr/src/sys/sys/vnode.h 中定义了一个 vnode 的结构。但是,我看到有时在执行操作时(比如说 ufs_getattr),一个 vnode* 作为
我有一些 C++ 代码可以在 Linux 上很好地编译,但到目前为止我无法在 NetBSD 上正确编译它。 这些是我的包括: #include #include #include #includ
我正在使用以下代码使用 SpringLayout 制作 GUI: private void createAndShowGUI() { frame = new JFrame("A GUI");
我有一些嵌入式系统运行在带有 mips 处理器的 netbsd 上。 我想和他们一起玩一下,据我所知,我需要一个交叉编译器。我从来没有做过这样的事情,我发现的所有信息都是假设我没有的知识。 那么我需要
我使用的是 Linux 2.6.38 (fc14)。获取套接字文件描述符(比如 TCP 套接字)上可用空间量的 ioctl 标志是什么?我发现 NetBSD 有 FIONREAD、FIONWRITE
我正在研究用 C 编写的网络套接字编程。什么是为 FreeBSD 和/或 NetBSD 实现的最快(最高性能)的 I/O 策略?具体来说,如果我要在 C 语言中为 FreeBSD/NetBSD 实现
接收基于 FreeBSD 或 NetBSD 的商业 TCP/IP 堆栈实现的建议。要求类似于运行浏览器、电子邮件和流式语音/视频的典型台式 PC。也就是说,具有成熟实现和合理性能的终端主机类型设备的丰
测试场景是 ping 来 IP 和 ctr+C 从脚本中交替调用。 似乎当信号处理程序被调用时,ping 是在 malloc 中。信号处理程序还调用了 malloc,并且 malloc 返回了以下警告
我使用的是旧版本的 netbsd。我想将 openssh 配置为使用强密码和 mac,但是当看到可用的 mac 时,它不支持 SHA256 和更高版本。支持的 mac 是 macs[] = {
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我是一名优秀的程序员,十分优秀!