首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >浮点乘法错误在68881的Amiga上使用gcc 2.7.0 -有什么修复/变通方法吗?

浮点乘法错误在68881的Amiga上使用gcc 2.7.0 -有什么修复/变通方法吗?
EN

Stack Overflow用户
提问于 2019-12-18 09:32:08
回答 1查看 100关注 0票数 2

最重要的是,我决定看看我多年前开始在Amiga上编写并在其他机器上进一步开发的程序是否仍然可以在Amiga上编译和运行(在其他机器上开发之后)。我最初使用的是Lattice C,因为我之前就是这么用的。但是在Lattice中68881的支持是非常错误的。所以我决定试一试gcc。我想最新的版本是2.7.0 (所以我不能升级)。它运行得相当好,除了68881支持中的一个错误:当将任何负数乘以零时,结果总是:

1.:00000

打印出来时(冒号不是打字错误)。顺便说一句,如果你把x设置为0,然后打印出来,它就是0.00000。

这是一个测试bug的示例程序,哪个变量是0,哪个变量是负都无关紧要,如果非零值是正的,它就可以正常工作。

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>

main()
{
    float x,a,b;

    a=-10.0;
    b=0.0;
    x=a*b;
    printf("%f\n",x);
}

它是用:gcc -o tt -m68020 -m68881 tt.c -lm编译的

去掉-m68881可以很好地工作(当然,不使用FPU)去掉-lm和/或math.h没有区别。

有没有人知道错误修复或解决方法?也许是一个gcc的命令行参数?(宁可不做像“if ((a<0)&&(b==0))”这样丑陋的事情)

顺便说一句,由于我不再有一个可以工作的Amiga,我不得不使用一个仿真器。如果你想看看我在这个项目上做了什么(使用Lattice版本),你可以在以下位置查看我的视频:

https://www.youtube.com/watch?v=x8O-qYQvP4M

(Amiga部分从10:07开始)

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2019-12-26 15:39:01

这不是一个确切的答案,但揭示了这个问题相当复杂(比gcc的简单bug更复杂)。以下是信息:

如果我使用68040的内部FPU将Amiga仿真器设置为模拟68020或68030和68881或68882而不是68040,它不会生成1.:00000 (换句话说,它可以工作)。因此,这可能意味着模拟器无法正确模拟68040的FPU (尽管我认为68040的FPU可能与68881/68882兼容)。(不知道将仿真器设置为68020/30 68881/2是否会影响性能(我将仿真器设置为在主机上尽可能快地运行,而不是以680xx的速度运行))。

但是,如果我使用Amiga的gcc的-noixemul选项进行编译,代码在所有CPU和FPU的组合中都能正常工作。因此,这表明这是Amiga版本的gcc (实际上是试图在Amiga上模拟UNIX的gcc系统的一部分(这就是ixemul.library所做的))的问题。因此,这可能不是gcc的错(如果它是在其他使用68040的系统上编译的,它可能会工作),而是把gcc移植到Amiga的人的错。

所以,你可能会说“问题解决了,用-noixemul就行了”--嗯,别那么快……虽然简单的测试程序不会崩溃,但我的暴露这个问题的大程序只有在使用-noixemul编译时才会在程序退出时崩溃(可恢复的大师冥想)(可能它试图关闭一个从未打开过的库,我不知道)。这就是为什么我没有使用-noixemul,尽管我想这样做。

所以,它还没有完全解决,但我想说它不太可能是一个非Amiga的gcc bug。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59384338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档