c/c++语言开发共享我怎么在C中错误地使用round()函数?

我从math.h库中的round()roundf()函数得到了意想不到的结果。 以下是示例代码:

 #include  #include  int main(void) { float f; double d; /* Note man page says that roundf() returns a float and round() returns a double */ f = roundf(1.2); d = round(1.2); printf("%fn", f); printf("%lfn", d); return 0; } 

当我编译并运行程序时,我得到:

 gcc -lm round.c ./a.out 288.000000 524288.000000 

哇哇哇?

更新:除了答案,我已经确认代码在较新的编译器上正常工作。 (我认为%lf不是正确的printf说明符,但在这种情况下不会影响最终结果。)我需要弄清楚为什么编译器会以这种方式运行,因为我运行的代码使用round()和已在同一台机器上编译。 当我弄明白时,我会更新post。

 gcc -v Reading specs from /usr/lib/gcc-lib/i386-slackware-linux/2.95.3/specs gcc version 2.95.3 20010315 (release) 

    如果编译代码而不告诉gcc使用C99模式编译( -std=c99 )并告诉它不要知道“特殊内置”函数(使用-fno-builtin ),则可能会失败。 然后它假定你的round / roundf函数被定义为

     int round(); int roundf(); 

    因为在C99之前的时代还没有这样的函数,所以它没有声明,然后隐式声明它们。 这显然会失败,因为调用端将返回值视为int,而被调用方(在链接库中的那些函数的定义中)返回float。 我得到这些结果,例如:

     [js@HOST2 cpp]$ ./a.out 1065353216.000000 -1048576.000000 [js@HOST2 cpp]$ 

    并不是说您现在可以将返回值强制转换为浮点值并且可以。 嗯,情况更糟。 返回值甚至不保证与返回的float有任何关系。 调用端从一个知道返回整数的位置读取。 但是你的编译器可能会从被调用方返回另一个地方(例如浮点指针寄存器中)的浮点数。 上面实际上可以做任何事情,包括中止程序,因为它以不确定的方式运行。

    那么,你能做些什么让它发挥作用? 将编译器传递给std=c99标志或使用其他方法进行舍入(floor是其中之一),这些方法不需要这些函数

     gcc -std=c99 test.c -lm 

    看到man 3 round 。 但是,如果你有一个非常老的GCC – 我不确定它是否支持足够的C99来进行那个转换。 然后查看圆形联机帮助页中描述的function测试宏。

    当我编译并运行这个确切的代码(在cygwin上的gcc下)时,我得到:

     $ ./a.exe 1.000000 1.000000 

    你的编译器有多新? 编译器错误是我能想到的,因为gcc -Wall也没有给出任何警告。

    为了添加一些进一步的信息, 这个论坛主题似乎显示更改编译器到更新的版本修复它。 如果这对您不起作用,您需要提供有关编译器和操作系统的更多详细信息,但鉴于这似乎适用于三个不同平台上的其他人,看起来您的编译器有问题。

    为了增加批准的合唱,这对我来说很好(OS X Leopard使用gcc)。

    出于好奇,你需要使用-lm标志吗? 我不是第一次,我第二次做了,没有区别,但那是因为libm.dylib和libc.dylib是OS X上同一个库的符号链接。也许你的libm坏了或什么? 你需要链接到libm吗? 我认为math.h函数将成为libc的一部分……?

    编辑:

    在您执行任何操作之前,请尝试使用此代码:

     float f = 0; double d = 0; 

    我认为不应该改变任何东西,但如果确实如此,我就赢了。

    在Ubuntu上使用gcc版本4.3.2再一次“在我的机器上运行”。

     $ ./a.out 1.000000 1.000000 

    不过,编译时我会收到一些警告。

     $ gcc -lm round.c round.c: In function 'main': round.c:11: warning: incompatible implicit declaration of built-in function 'roundf' round.c:12: warning: incompatible implicit declaration of built-in function 'round' 

    litb在正确的轨道上。 -std=c99不起作用,但添加#define _ISOC99_SOURCE有效。 所以代码看起来像:

     #define _ISOC99_SOURCE #include  #include  int main(void) { ... 

    这显然无济于事,但代码看起来像我预期的那样运行。 一切似乎都很好。

    看起来你正确使用它,描述一下你的环境?

    需要了解更多c/c++开发分享我怎么在C中错误地使用round()函数?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享我怎么在C中错误地使用round()函数?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979180.html

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐