gpt4 book ai didi

c++ - 在不使用 modf() 的情况下获取 float 的小数部分

转载 作者:IT老高 更新时间:2023-10-28 21:37:48 26 4
gpt4 key购买 nike

我正在开发一个没有数学库的平台,所以我需要构建自己的工具。我目前获取分数的方法是将 float 转换为定点(乘以 (float)0xFFFF,强制转换为 int),仅获取下部(掩码为 0xFFFF)并再次将其转换回 float 。

但是,不精确正在杀死我。我正在使用我的 Frac() 和 InvFrac() 函数来绘制抗锯齿线。使用 modf 我得到一条非常平滑的线。使用我自己的方法,由于精度损失,像素开始跳动。

这是我的代码:

const float fp_amount = (float)(0xFFFF);
const float fp_amount_inv = 1.f / fp_amount;

inline float Frac(float a_X)
{
return ((int)(a_X * fp_amount) & 0xFFFF) * fp_amount_inv;
}

inline float Frac(float a_X)
{
return (0xFFFF - (int)(a_X * fp_amount) & 0xFFFF) * fp_amount_inv;
}

提前致谢!

最佳答案

如果我正确理解您的问题,您只需要小数点后的部分,对吗?您实际上不需要分数(整数分子和分母)?

所以我们有一些数字,比如 3.14159,我们希望只得到 0.14159。假设我们的数字存储在 float f; 中,我们可以这样做:

f = f-(long)f;

如果我们插入我们的号码,其工作方式如下:

0.14159 = 3.14159 - 3;

这样做是删除 float 的整数部分,只留下小数部分。当您将 float 转换为长整数时,它会删除小数部分。然后,当您从原始 float 中减去它时,您只剩下 小数部分。由于 float 类型的大小(在大多数系统上为 8 字节),我们需要在这里使用 long。整数(在许多系统上只有 4 个字节)不一定大到足以覆盖与 float 相同的数字范围,但 long 应该如此。

关于c++ - 在不使用 modf() 的情况下获取 float 的小数部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2594913/

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