【发布时间】:2016-10-01 12:29:23
【问题描述】:
我需要将归一化的整数值与实数浮点值相互转换。例如,对于 int16_t,值 1.0 由 32767 表示,-1.0 由 -32768 表示。尽管对每种整数类型(包括有符号和无符号)都执行此操作有点繁琐,但手动编写仍然很容易。
但是,我想尽可能使用标准方法,而不是重新发明轮子,所以我正在寻找标准 C 或 C++ 头文件、Boost 库或其他一些小型、可移植、已经执行这些转换的易于合并的源。
【问题讨论】:
-
我不确定是否需要库...
double convert(int16_t x) {return x < 0 ? x/double(32768) : x/double(32767);}。可以使用std::numeric_limits轻松地将其模板化并推广到所有 int 类型。无论如何,它的制作时间很短,而且肯定不在 std 库中。也看这里:stackoverflow.com/questions/929103/… -
@coyotte508 虽然我还没有找到它,但我真的在寻找/希望已经模板化的东西,比如标准库中的 std::numeric_limits,因为我知道我已经这样做了不是唯一需要这个的。我在职业生涯中花了很多时间编写本来可以而且应该已经标准化的代码,但后来发现有人已经编写了这些代码,这些天我在自己编写之前尝试找到现有的标准化代码。顺便说一句,谢谢你的链接。
-
我通常会同意,但是当它是一行时,将它“内联”(在现场)比包裹在一个不起眼的想要标准的名称函数调用中更清楚。顺便说一句,与问题正交,您确定要使用浮点数吗?精度在 0 到 1 之间变化很大。
-
@v.oddou 这是一个很好的观点,即使是这样一个简单的问题,也可能会出现问题,具体取决于您的使用案例,例如stackoverflow.com/questions/599976/…。顺便说一句,我正在使用双打(或我的代码中出现的 float64_t),但我想笼统地问这个问题,这样我就不会限制我得到的答案。我在 SO 上遇到了很多好的但晦涩难懂的链接,即使它不是您正在寻找的内容(例如,它使用浮点数而不是双精度数),您仍然可以经常找到一些非常好的东西。跨度>
-
这个问题没有完全说明。如果 -32768 和 32767 分别代表 -1 和 1,那么要么正负数的缩放比例不同,要么 0 不代表 0。在前一种情况下,相反符号的代表数字之间的加法和减法将得出错误的结果。在后一种情况下,代表的简单乘法会得出错误的结果。
标签: c++ floating-point integer