QEMU模拟HP-UX 10.20时数学运算结果异常求助
QEMU模拟PA-RISC架构HP-UX 10.20时浮点数运算异常问题
环境说明
- 宿主机:Debian 12,基于最新源码编译QEMU,配置命令:
./configure --target-list=hppa-softmmu --enable-numa --enable-slirp
- 虚拟机:从官方光盘全新安装HP-UX 10.20,包含Fortran 77、C Softbench等所需组件,目标是替代老旧HP9000,在虚拟机中运行原有应用
- QEMU启动命令:
./qemu/build/qemu-system-hppa \ -boot m \ -m 512 \ -serial telnet::4441,server,nowait \ -monitor telnet::4442,server,nowait \ -nographic \ -serial mon:stdio \ -d guest_errors \ -D ~/data/trace/qemu.log \ -drive if=scsi,bus=0,index=6,file=./disks/XXXX.img,format=raw \ -netdev bridge,id=hn0,br=vmbr0,helper=./qemu/build/qemu-bridge-helper \ -device tulip,netdev=hn0,id=nic1 \ -smp cpus=1 \ -accel tcg,thread=multi
问题现象
虚拟机的安装、管理及应用编译(f77/cc编译器)均正常,但浮点数运算存在严重异常:
- C语言float、Fortran real*4类型运算结果错误
- double/real*8类型问题更严重
- 运行过程中会触发IEEE下溢、上溢异常
测试案例
1. C语言测试程序
代码(sanitycheck.c)
#include <stdio.h> #include <math.h> int main() { printf("log(1.0) = %f\n", log(1.0)); printf("log(10.0) = %f\n", log(10.0)); printf("log(0.1) = %f\n", log(0.1)); printf("exp(0.0) = %f\n", exp(0.0)); printf("exp(1.0) = %f\n", exp(1.0)); printf("exp(-1.0) = %f\n", exp(-1.0)); return 0; }
编译命令
cc sanitycheck.c -lm -o sanitycheck
运行结果
./sanitycheck log(1.0) = 1.814607 log(10.0) = 1.637750 log(0.1) = -12566537942365843300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 exp(0.0) = 1.000003 exp(1.0) = 5.516857 exp(-1.0) = -0.013606
2. Fortran测试程序
代码(tracemaths.f)
PROGRAM TESTMATH REAL*4 RES, A, B, C, RATIO, LOGVAL, PROD A = 0.9001003 B = 4.0 C = 0.13114248 RATIO = A / B PRINT *, 'RATIO = ', RATIO LOGVAL = ALOG(RATIO) PRINT *, 'LOGVAL = ', LOGVAL PROD = C * LOGVAL PRINT *, 'PROD = ', PROD RES = EXP(PROD) PRINT *, 'RES = ', RES RES = (A / B) ** C PRINT *, 'RES = ', RES END
默认编译命令及结果
编译命令:
f77 +E1 -C -g tracemaths.f -o tracemaths
运行结果:
./tracemaths RATIO = .2250251 LOGVAL = -1.49154 PROD = -.195605 RES = .8223372 RES = 3.92838E+14
注:通过指数形式实现幂运算(
EXP(PROD))结果正常,但直接使用**运算符结果错误。
添加+T编译选项后的结果
编译命令:
f77 +T +E1 -C -g tracemaths.f -o tracemaths
运行结果:
./tracemaths RATIO = .2250251 LOGVAL = -1.49154 PROD = -.195605 RES = .8223372 PROGRAM ABORTED : IEEE underflow PROCEDURE TRACEBACK: ( 0) 0xc0d41b78 + 0xc0d41b79 [././tracemaths]
求助
以上结果明显不符合预期,恳请提供解决思路。
内容的提问来源于stack exchange,提问作者YfNk
相关产品推荐
相关产品推荐

