gpt4 book ai didi

将 double 组转换为无符号短整型数组?

转载 作者:行者123 更新时间:2023-11-30 19:11:59 24 4
gpt4 key购买 nike

  Prob = *((unsigned short*)(Prob));

Prob = (unsigned short)(Prob);

这对我不起作用。如何正确转换?

最佳答案

您面临的最大问题是那些超过 USHRT_MAX 的 double 值。其次,您需要解决舍入问题。解决这两个问题并将舍入设置为 .5 的简单方法可能如下所示,其中函数 array_dbl2short 返回成功转换为 unsigned Short 的 double 值的数量:

size_t array_dbl2short (unsigned short *usa, double *da, size_t n)
{
if (!usa || !da || !n) return 0;
register size_t i, ncnvt = 0;

for (i = 0; i < n; i++) {
if (da[i] < 0 || (unsigned long long)(da[i] + 0.5) > USHRT_MAX)
fprintf (stderr, "error: %lf outside range for conversion.\n",
da[i]);
else
usa[ncnvt++] = (unsigned short)(da[i] + 0.5);
}

return ncnvt;
}

其使用的一个简短示例是:

#include <stdio.h>
#include <limits.h>

size_t array_dbl2short (unsigned short *usa, double *da, size_t n);

int main (void) {

double arr[] = { 1.49, 1.5, 65535.49, 65535.5, -1.9, 25671.8 };
size_t i, n, nelem = sizeof arr/sizeof *arr;
unsigned short usarr[nelem];

if ((n = array_dbl2short (usarr, arr, nelem))) {
printf ("\n unsigned short array:\n\n");
for (i = 0; i < n; i++)
printf (" usarr[%zu] : %hu\n", i, usarr[i]);
}

return 0;
}

size_t array_dbl2short (unsigned short *usa, double *da, size_t n)
{
if (!usa || !da || !n) return 0;
register size_t i, ncnvt = 0;

for (i = 0; i < n; i++) {
if (da[i] < 0 || (unsigned long long)(da[i] + 0.5) > USHRT_MAX)
fprintf (stderr, "error: %lf outside range for conversion.\n",
da[i]);
else
usa[ncnvt++] = (unsigned short)(da[i] + 0.5);
}

return ncnvt;
}

(注意:double 值的实部必须能够表示为unsigned long long 使转换验证正常工作)

示例使用/输出

$ ./bin/dbl2ushort
error: 65535.500000 outside range for conversion.
error: -1.900000 outside range for conversion.

unsigned short array:

usarr[0] : 1
usarr[1] : 2
usarr[2] : 65535
usarr[3] : 25672

此解决方案无法解决所有可能的舍入和转换问题。您还可以使用 math.h 中的函数(例如 modf、round 等)来执行实部和舍入。如果您还有其他问题,请告诉我。

关于将 double 组转换为无符号短整型数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38228889/

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