我正在用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,这显然是错误的。
答案 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