You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用double类型的运算耗时远高于uint64_t类型?

double与uint64_t累加运算耗时差异的原因分析

问题背景

在编写C语言代码时发现,使用double类型执行累加运算的耗时明显高于uint64_t类型,以下是测试代码及结果:

Double类型测试代码

#include <stdio.h>
#include <sys/time.h>
#include <stdint.h>

int main () {
    double sum = 0;
    double add = 1;

    // Start measuring time
    struct timeval begin, end;
    gettimeofday(&begin, 0);
    
    int iterations = 1000*1000*1000;
    for (int i=0; i<iterations; i++) {
        sum += add;
    }
    
    // Stop measuring time and calculate the elapsed time
    gettimeofday(&end, 0);
    uint64_t seconds = end.tv_sec - begin.tv_sec;
    uint64_t microseconds = end.tv_usec - begin.tv_usec;
    uint64_t elapsed = (seconds * 1000000) + microseconds;
    
    printf("Result: %.20f\n", sum);
    
    printf("Time measured: %lu microseconds.\n", elapsed);
    
    return 0;
}

uint64_t类型测试代码

#include <stdio.h>
#include <sys/time.h>
#include <stdint.h>

int main () {
    uint64_t sum = 0;
    uint64_t add = 1;

    // Start measuring time
    struct timeval begin, end;
    gettimeofday(&begin, 0);
    
    int iterations = 1000*1000*1000;
    for (int i=0; i<iterations; i++) {
        sum += add;
    }
    
    // Stop measuring time and calculate the elapsed time
    gettimeofday(&end, 0);
    uint64_t seconds = end.tv_sec - begin.tv_sec;
    uint64_t microseconds = end.tv_usec - begin.tv_usec;
    uint64_t elapsed = (seconds * 1000000) + microseconds;
    
    printf("Result: %lu\n", sum);
    
    printf("Time measured: %lu microseconds.\n", elapsed);
    
    return 0;
}

测试结果

Double: 
Result: 1000000000.00000000000000000000
Time measured: 4669474 microseconds.

Uint64-t: 
Result: 1000000000
Time measured: 1888623 microseconds.

耗时差异的核心原因

造成这种差异的本质是CPU对整数运算和浮点运算的硬件实现逻辑不同,具体可以拆解为几点:

  • 运算单元的效率差异
    现代CPU的整数运算单元(ALU)轻量高效,uint64_t的累加是基础整数加法,单个周期就能完成,甚至能通过指令级并行在同一周期执行多个加法操作。而浮点运算单元(FPU)处理double加法需要多步操作:对齐指数位、尾数相加、归一化及舍入,整个流程需要多个CPU周期,单周期吞吐量远低于整数加法。

  • 指令优化空间不同
    编译器对整数加法的优化更直接,比如循环展开、利用寄存器直接累加,甚至部分架构支持批量处理。而double累加受限于浮点运算规则,优化空间更小——浮点加法的依赖链(下一次运算需要上一次的结果)难以打破,无法像整数那样充分利用并行性。

  • 寄存器与数据通路的差异
    整数寄存器数量更多,数据通路带宽更高,适合高频基础运算。浮点寄存器虽存在,但浮点运算的数据通路设计更复杂、延迟更高,double作为64位浮点数,处理时需要更多电路资源,自然比64位整数加法慢。

补充:测试中double累加1e9次结果仍准确,是因为1e9在double的精确整数表示范围内(double可精确表示2^53以内的整数),超出范围后结果会失真,但这与耗时无关。

内容的提问来源于stack exchange,提问作者Dremond Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:32:52