You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:53:19