memset(ary,0,length) 是一种在双数组中输入零的可移植方式[重复]

Posted

技术标签:

【中文标题】memset(ary,0,length) 是一种在双数组中输入零的可移植方式[重复]【英文标题】:is memset(ary,0,length) a portable way of inputting zero in double array [duplicate] 【发布时间】: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

【问题讨论】:

欺骗***.com/questions/1373369/… AFAIK,从技术上讲,0.0 不需要由所有位为零的位模式表示。关注Viktor's advice,如果它在平台上以这种方式工作,我希望std::fill() 的实现能够在内部调用std::memset() @Matthew 你认为这有什么不同? new 不是 C 的一部分。您需要使用 malloc 或 calloc 或将标记更改回 C++。 @JeremeyP 是的,抱歉。 【参考方案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 返回值。

【讨论】:

以上是关于memset(ary,0,length) 是一种在双数组中输入零的可移植方式[重复]的主要内容,如果未能解决你的问题,请参考以下文章

js数组清空和去重

冒泡排序

JS算法

JavaScript中清空数组的三种方式

数组去重

数组排序-------1.冒泡排序