gpt4 book ai didi

c++ - 我最近遇到的 abs() 使用中的奇怪错误

转载 作者:IT老高 更新时间:2023-10-28 13:02:38 27 4
gpt4 key购买 nike

我有我构建的 C++/C 混合代码

a) Win-7 x32 上的 Visual C++ 2010 Express(免费版)。

b) 安装在 Windows-7 Home 高级版 x32 上的 Cygwin/Gcc 环境。 gcc 3.4.4 版本(cygming special, gdc 0.12, using dmd 0.125)

c) Ubuntu 10.04 Linux-GCC 版本 4.4.3 (Ubuntu 4.4.3-4ubuntu5)

我有一个代码如下(它是我的用户定义类的成员函数),它计算传递的对象 myhalf-的绝对值-

myhalf::myhalfabs(myhalf a)
{
float tmp;
tmp = abs(a.value); //This abs is from math.h :- float abs(float)
return tmp;
}

这在 MS - Visual C++ 2010 中完美运行。 -ve nos 的 abs() 正确返回为具有相同值的 +ve nos。奇怪的是,当我在上面提到的 b) Cygwin/gcc 环境和 c) Linux-gcc 4.4.3 上构建此代码时,我得到了垃圾输出。所以启动了 gdb,经过大量的汗水和对代码的“二进制搜索方法”以确定它开始出错的地方,我点击了这段代码,如上所示:

tmp = abs(a.value);

在 cygwin/gcc 下表现异常。

对于 -ve 数字 abs() 返回 0(零)。什么鬼??

然后作为一种解决方法,避免从 stdlib 调用 abs(),并将我自己的 abs 编码如下:

myhalf::myhalfabs(myhalf a)
{
float tmp;
unsigned int tmp_dbg;
// tmp = abs(a.value);
tmp_dbg = *(unsigned int*)(&a.value);
tmp_dbg = tmp_dbg & 0x7FFFFFFF;
tmp = *(float*)(&tmp_dbg);

return tmp;
}

这在 cygwin/gcc 和 linux-gcc 上运行良好,并且输出符合预期,当然它在 MS-Visual C++ 2010 上运行良好。

这是我使用的 cygwin/gcc 和 linux-gcc 构建的整个 Makefile。只是如果有人怀疑那里有什么可疑之处:-

OBJS= <all my obj files listed here explicitly>

HEADERS= <my header files here>
CFLAGS= -Wall
LIBS= -lm
LDFLAGS= $(LIBS)

#MDEBUG=1
ifdef MDEBUG
CFLAGS += -fmudflap
LDFLAGS += -fmudflap -lmudflap
endif

myexe: $(OBJS)
g++ $(OBJS) $(LDFLAGS) -o myexe

%.o: %.cpp $(HEADERS) Makefile
g++ $(CFLAGS) -c $<

clean:
rm -f myexe $(OBJS)

1] 这里发生了什么?这个奇怪的错误的根本原因是什么?

2] 我是否在 cygwin 上使用了一些旧版本的 gcc,它存在已知错误或其他问题?

3] 这个函数 float abs(float) 是否已被弃用或被新版本取代?

任何指针都是有用的。

最佳答案

math.habs的C版本在 int 上运行s。使用<cmath>对于 C++ 重载或使用 fabs()对于 C 浮点版本。

关于c++ - 我最近遇到的 abs() 使用中的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7614520/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com