当存在明显差异时 difftime 返回 0

2024-06-11

我有以下 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读取格式字符串,它首先需要一个int4个字节,和一个double8 个字节。printf得到int正确,因为你是小尾数并且你的前四个字节long long足以代表价值。printf然后得到double它获取的最后四个字节long long,随后是前四个字节double。作为最后四个字节long long是零,什么printf认为是一个以四个字节开头且值为零的双精度值,导致一个非常非常小的值double根据双精度数的二进制表示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当存在明显差异时 difftime 返回 0 的相关文章

随机推荐