gpt4 book ai didi

c++ - 拆分 64 位值以适应 double 参数类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:51:08 24 4
gpt4 key购买 nike

我有一个我无法更改其语法的函数,假设这是我正在调用的某个库函数:

void schedule(double _val);

void caller() {
uint64_t value = 0xFFFFFFFFFFFFFFF;
schedule(value);
}

由于函数 schedule 接受 double 作为参数类型,在参数值大于 52 位的情况下(考虑 double 将尾数存储为 52 位值)我在这种情况下会降低精度。

我打算做的是,如果该值大于 double 可以容纳的最大值,我需要循环获取剩余的值,以便最终得出正确的值。

    void caller() {
uint64_t value = 0xFFFFFFFFFFFFFFF;
for(count = 0; count < X ; count++) {
schedule(Y);
}
}

我需要从变量“值”中提取 X 和 Y。如何实现?我的目标是不要因为类型转换而降低精度。

最佳答案

如果您的问题只是在 caller 中丢失精度而不是在 schedule 中,则不需要循环:

void caller() {
uint64_t value = 0xFFFFFFFFFFFFFFF;
uint64_t modulus = (uint64_t) 1 << 53;
schedule(value - value % modulus);
schedule(value % modulus)
}

value - value % modulus中,只有高11位有效,因为低53位已经被清除。所以,当它转换为double时,没有错误,准确的值被传递给了schedule。类似地,value % modulus 只有 53 位并且被精确地转换为 double。

(IEEE-754 64 位二进制浮点对象的有效位编码有 52 位,但由于隐含的前导位,实际有效位有 53 位。)

注意:以上可能导致 schedule 被调用时参数为零,我们尚未确定这是允许的。如果这是一个问题,那么应该跳过这样的调用。

关于c++ - 拆分 64 位值以适应 double 参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15749765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com