C宏使用文字vs变量产生不同的结果

超级猪

我有以下C程序:

#include <stdio.h>
#include <math.h>

#define LOG2(x) ((int)( log((double)(x)) / log(2) ))

int main() {

    int num = 64;
    int val1 = LOG2(num);
    int val2 = LOG2(64);

    printf("val1: %d, val2 %d\n", val1, val2);

    return 0;
}

哪个输出:

val1: 5, val2: 6

当我将其与变量一起使用时,为什么该宏会产生不同的(错误的)答案,但是当我直接键入64时,它可以正确地工作吗?

不管这实际上是否是获取日志库2的好方法,是什么导致此行为?有什么办法可以使这个宏与变量一起正常工作?(我所有的输入将是2的精确乘方)

史蒂夫·萨米特(Steve Summit)

从数学上讲,这是计算以2为底的对数的一种好方法,但是由于log(val)和log(2)都将是冗长且混乱的分数,因此除法的结果最终不会是5.999 ,它将被截断为5。我建议四舍五入,特别是如果您知道输入将始终为2的幂。

(但是为什么对常量和变量会得到不同的答案?这是一个好问题,我不确定答案。通常的答案是,当涉及常量时,编译器能够执行部分/全部编译时进行计算,但通常编译器最终会使用与运行时环境相比微妙或明显不同的浮点算法。但是我不会想到编译器会像log()在进行编译时常量折叠时那样解释函数。)


另外,某些C库具有log2()应为您提供完美答案的功能,但我不知道该功能的标准程度。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Makefile 变量产生不同的结果

来自分类Dev

为什么在使用 SPI 时全局缓冲区变量产生的结果与局部缓冲区变量不同?

来自分类Dev

使用变量__builtin_clz如何将文字0和0作为变量产生不同的行为?

来自分类Dev

Deepcopying函数变量产生意外结果

来自分类Dev

module.exports 变量产生未定义的结果

来自分类Dev

如何从Expect中的变量产生

来自分类Dev

使用变量vs获取输入值时substr()的不同结果

来自分类Dev

C ++对对象变量值的连续检查会产生不同的结果?

来自分类Dev

矩阵变量产生不正确的HATEOAS链接

来自分类Dev

接收一个或多个推送通知是否会对电池使用量产生不同的影响?

来自分类Dev

C ++宏使用变量的值

来自分类Dev

> 和 &> 产生不同的结果

来自分类Dev

C ++:后增量产生相同的值

来自分类Dev

C语言:scanf函数使用float和double类型会产生不同的结果吗?

来自分类Dev

如果我使用宏与局部变量执行除法,为什么我的结果会有所不同?

来自分类Dev

在cmd中手动运行命令所产生的结果与使用Python产生的结果不同

来自分类Dev

C#和Access VBA中的查询产生不同的结果

来自分类Dev

iOS中的CommonCrypto与C#中的Rijndael产生不同的结果

来自分类Dev

为什么此matlab和C ++代码产生不同的结果?

来自分类Dev

复选框组合使用jQuery产生不同的结果

来自分类Dev

与CompletableFuture使用时WorkStealingPool和的ThreadPoolExecutor产生不同的结果

来自分类Dev

在MINUS查询中指定列会产生与使用*不同的结果

来自分类Dev

为什么使用引号时“ wsl”会产生不同的结果?

来自分类Dev

在Array中使用名称会在Firefox中产生不同的结果

来自分类Dev

使用 cast(date as datetime) 更新会产生不同的结果

来自分类Dev

在JIT中使用全局变量会产生垃圾结果

来自分类Dev

基于使用 sql 变量的不同结果

来自分类Dev

不同变量行之间的差异,避免使用宏方法

来自分类Dev

大量产生可能的单词

Related 相关文章

  1. 1

    Makefile 变量产生不同的结果

  2. 2

    为什么在使用 SPI 时全局缓冲区变量产生的结果与局部缓冲区变量不同?

  3. 3

    使用变量__builtin_clz如何将文字0和0作为变量产生不同的行为?

  4. 4

    Deepcopying函数变量产生意外结果

  5. 5

    module.exports 变量产生未定义的结果

  6. 6

    如何从Expect中的变量产生

  7. 7

    使用变量vs获取输入值时substr()的不同结果

  8. 8

    C ++对对象变量值的连续检查会产生不同的结果?

  9. 9

    矩阵变量产生不正确的HATEOAS链接

  10. 10

    接收一个或多个推送通知是否会对电池使用量产生不同的影响?

  11. 11

    C ++宏使用变量的值

  12. 12

    > 和 &> 产生不同的结果

  13. 13

    C ++:后增量产生相同的值

  14. 14

    C语言:scanf函数使用float和double类型会产生不同的结果吗?

  15. 15

    如果我使用宏与局部变量执行除法,为什么我的结果会有所不同?

  16. 16

    在cmd中手动运行命令所产生的结果与使用Python产生的结果不同

  17. 17

    C#和Access VBA中的查询产生不同的结果

  18. 18

    iOS中的CommonCrypto与C#中的Rijndael产生不同的结果

  19. 19

    为什么此matlab和C ++代码产生不同的结果?

  20. 20

    复选框组合使用jQuery产生不同的结果

  21. 21

    与CompletableFuture使用时WorkStealingPool和的ThreadPoolExecutor产生不同的结果

  22. 22

    在MINUS查询中指定列会产生与使用*不同的结果

  23. 23

    为什么使用引号时“ wsl”会产生不同的结果?

  24. 24

    在Array中使用名称会在Firefox中产生不同的结果

  25. 25

    使用 cast(date as datetime) 更新会产生不同的结果

  26. 26

    在JIT中使用全局变量会产生垃圾结果

  27. 27

    基于使用 sql 变量的不同结果

  28. 28

    不同变量行之间的差异,避免使用宏方法

  29. 29

    大量产生可能的单词

热门标签

归档