【问题标题】:initialize float-type array using memset使用 memset 初始化浮点型数组
【发布时间】:2018-06-27 12:11:21
【问题描述】:

我有一个指针float *ptr,在长度为n的动态分配之后,我想用零或一来初始化这个数组,所以我使用memset(ptr,0,n*sizeof(float))memset(ptr,1,n*sizeof(float))。这合法吗?因为memset的第二个参数是int型,恐怕不能适用于float型。

【问题讨论】:

  • 该参数是将每个字节设置为的值,而不是每个 32 位字。 0x0 是浮点数零,但 0x01010101 不是 1,而是 ~2.3*10**-38
  • 那么用 0 值初始化是可以的,而 1 是危险的?
  • 不,它们既安全又明确;只是你无法使用 memset 看到浮点数为 1 的数组;接口不支持。

标签: c memset


【解决方案1】:

memset(ptr,1,n*sizeof(float))。这合法吗?

不,不要将float 的值设置为1.0f 作为float 的编码而不是字节1,1,1,1 @James Picone


memset(ptr,0,n*sizeof(float)) 或更好的 memset(ptr, 0, sizeof *ptr * n) 会将每个字节设置为 0。这肯定是 float 0.0f 的编码。

要将float 数组的每个元素设置为1.0f 或任何值,只需使用循环即可。

float init_value = 1.0f;
for (size_t i = 0; i < n; n++) {
   ptr[i] = init_value;
}

【讨论】:

  • 在 IEEE754 中所有位为零是 0.0f,但是标准不要求这样的表示
【解决方案2】:

将浮点数初始化为全零字节是可以的(它将产生浮点数 0.0)。但是 all-bytes-1 是不合理的,因为它会产生一个“垃圾”值(但每次都是相同的值)。

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 2012-09-29
    相关资源
    最近更新 更多