我有以下 C99 程序,用于测量简单除法运算相对于加法的性能。但是,那difftime
即使程序显然需要几秒钟的时间来处理,函数仍然返回 0runAddition
and runDivision
with iterations
设置为 10 亿。
#include <stdio.h>
#include <time.h>
void runAddition(long long iterations)
{
long long temp;
for (long long i = 1; i <= iterations; i++)
{
temp = temp + i;
}
}
void runDivision(long long iterations)
{
long long temp;
// Start at 1 to avoid division by 0!
for (long long i = 1; i <= iterations; i++)
{
temp = temp / i;
}
}
int main()
{
long long iterations = 1000000000;
time_t startTime;
printf("How many iterations would you like to run of each operation? ");
scanf("%d", &iterations);
printf("Running %d additions...\n", iterations);
startTime = time(NULL);
runAddition(iterations);
printf("%d additions took %f seconds\n", iterations, difftime(time(NULL), startTime));
printf("Running %d divisions...\n", iterations);
startTime = time(NULL);
runDivision(iterations);
printf("%d divisions took %f seconds\n", iterations, difftime(time(NULL), startTime));
}
您的格式字符串需要一个int
(%d
),和一个double
(%f
)。你的论点是long long
and double
。您应该将第一个格式字符串设置为%lld
.
将参数压入堆栈以调用时printf
,你推一个long long
使用8个字节,和一个double
也使用8字节。当函数printf
读取格式字符串,它首先需要一个int
4个字节,和一个double
8 个字节。printf
得到int
正确,因为你是小尾数并且你的前四个字节long long
足以代表价值。printf
然后得到double
它获取的最后四个字节long long
,随后是前四个字节double
。作为最后四个字节long long
是零,什么printf
认为是一个以四个字节开头且值为零的双精度值,导致一个非常非常小的值double
根据双精度数的二进制表示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)