将正浮点数组转换为无符号短数组,并按C++舍入

convert a positive float array to an unsigned short array with rounding in C++

本文关键字:数组 并按 舍入 C++ 无符号 转换      更新时间:2023-10-16

>我有一个正浮点数组,想将此数组转换为带有舍入的无符号短数组。我怎样才能以有效的方式做到这一点?下面是一个示例:

float floatArr[] = {1.2, 1.8, 2.1, 2.5, 3.2};
unsigned short usArr[5];
// I could do this
std::copy(floatArr, 5, usArr);

但是,它只会进行转换,因为它基本上复制了前两个字节。所以结果是usArr[] = {1, 1, 2, 2, 3}.我的问题是如何将这个带有舍入而不是强制转换的浮点数组转换为usArr[] = {1, 2, 2, 3, 3}?谢谢你,我将不胜感激任何帮助!

似乎您想四舍五入到最接近而不是向下舍入std::round这将有助于您。使用 std::transform 一步完成舍入和复制:

#include <algorithm>
#include <iostream>
#include <cmath>
int main()  
{
    float floatArr[] = {1.2, 1.8, 2.1, 2.5, 3.2};
    unsigned short usArr[5];
    // (1) Using a lambda to choose correct overload:
    std::transform(floatArr, floatArr + 5, usArr, [](float f){ return std::round(f); });
    // (2) Using static cast to enforce that specific overload is called:
    std::transform(floatArr, floatArr + 5, usArr, static_cast<float(*)(float)>(std::round));
    for(int i = 0; i < 5; ++i)
        std::cout << usArr[i] << ' ';
 }