【问题标题】:is memset(ary,0,length) a portable way of inputting zero in double array [duplicate]memset(ary,0,length) 是一种在双数组中输入零的可移植方式[重复]
【发布时间】:2010-06-01 08:32:24
【问题描述】:

可能重复:
What is faster/prefered memset or for loop to zero out an array of doubles

以下代码使用 memset 将所有位设置为零

int length = 5;
double *array = (double *) malloc(sizeof(double)*length);
memset(array,0,sizeof(double)*length);
for(int i=0;i<length;i++)
  if(array[i]!=0.0)
    fprintf(stderr,"not zero in: %d",i);

我可以假设这适用于所有平台吗?

double 数据类型是否始终符合 ieee-754 标准?

感谢您的回复, 并感谢 ::fill 模板命令。但我的问题更多的是双数据类型。

也许我应该为纯 c 写我的问题。 不过还是谢谢啦。

编辑:将代码和标签更改为 c

【问题讨论】:

  • AFAIK,从技术上讲,0.0 不需要由所有位为零的位模式表示。关注Viktor's advice,如果它在平台上以这种方式工作,我希望std::fill() 的实现能够在内部调用std::memset()
  • @Matthew 你认为这有什么不同?
  • new 不是 C 的一部分。您需要使用 malloc 或 calloc 或将标记更改回 C++。
  • @JeremeyP 是的,抱歉。

标签: c floating-point double ieee-754 memset


【解决方案1】:

如果您处于 C99 环境中,则无法得到任何保证。浮点数的表示在第 5.2.4.2.2 节中定义,但这只是逻辑的、数学的表示。该部分甚至没有提到浮点数如何以字节为单位进行存储。相反,它在脚注中说:

浮点模型旨在阐明每个浮点特性的描述,并不要求实现的浮点算法完全相同。

此外,第 6.2.6.1 节说:

除本小节中所述外,所有类型的表示均未指定。

在该子条款的其余部分中,没有提到浮点类型。

总之,不能保证0.0 被表示为全零位。

【讨论】:

    【解决方案2】:

    使用::std::fill(array, array+length, 0.0);

    【讨论】:

    • fill_n() 仅在您的容器不提供随机访问时才有用。
    【解决方案3】:

    它不是便携式的。只需使用循环。 您不需要强制转换 malloc 返回值。

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      相关资源
      最近更新 更多