将较小的正双精度浮点数除以较大的正数可得到负数的结果

时间:2019-01-25 18:11:33

标签: c math double

我正在用C语言编写一个代码,该代码分析所有排序技术的时间复杂性的恒定因素。我正在对这些常数进行统计研究。为此,我必须找到两个正双数的比率。令人惊讶的是,我得到了一个负面的结果。有人可以帮助我了解我在这里缺少什么吗?

我开始在Wiki https://en.wikipedia.org/wiki/C_data_types和这个https://www.geeksforgeeks.org/data-types-in-c/中进行挖掘,但这似乎并没有我想要的答案。

#include <stdio.h>

int main(void) {
    // your code goes here
    int i=1500;
    double j=9265.49;
    double result=(double)j/((double)(i*i*i*i));
    printf("%lf",result);
    return 0;
}

结果为-0.000007,这显然是错误的。

2 个答案:

答案 0 :(得分:3)

内部溢出

List<Map<String,Object>>ListMap数学和i*i*i*i溢出 1 ,这是未定义行为(UB)。 @Eugene Sh.

在OP的情况下,int->变成了int


避免乘法运算溢出。用更广泛的数学进行乘法。

i*i*i*i

输出

-1266441984

有关int main(void) { int i = 1500; double j = 9265.49; // double result=(double)j/((double)(i*i*i*i)); double result = (double) j / ((double) i * i * i * i); printf("%e", result); return 0; } 之类的代码的更多见解,请参见There are reasons not to use 1000 * 1000 * 1000


1 1.830220e-09 与32位i*i*i*i一样时。

答案 1 :(得分:1)

整数溢出:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main(int argc, char *argv[]) {
  int      i   = 1500;
  int32_t  i32 = 1500;
  uint32_t u32 = 1500;

  printf("i  : %lf\n", (double)(i*i*i*i));
  printf("i32: %lf\n", (double)(i32*i32*i32*i32));
  printf("u32: %lf\n", (double)(u32*u32*u32*u32));

  long int li  = 1500;
  int64_t  i64 = 1500;
  uint64_t u64 = 1500;

  printf("li : %lf\n", (double)(li*li*li*li));
  printf("i64: %lf\n", (double)(i64*i64*i64*i64));
  printf("u64: %lf\n", (double)(u64*u64*u64*u64));

  return(0);
}

在Linux上使用GCC 8的x86_64上的输出:

$ ./dummy 
i  : -1266441984.000000
i32: -1266441984.000000
u32: 3028525312.000000
li : 5062500000000.000000
i64: 5062500000000.000000
u64: 5062500000000.000000