Memset(ary、0、length)は、二重配列でゼロを入力するポータブルな方法です[複製

StackOverflow https://stackoverflow.com/questions/2948258

質問

可能な複製:
より速い/好みのメムセットまたはループのためにダブルスの配列をゼロにする

次のコードでは、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);

これがすべてのプラットフォームで機能すると仮定できますか?

二重データ型は常にIEEE-754標準に対応していますか?

返信ありがとうございます。:: fill Templateコマンドをありがとう。しかし、私の質問は、二重データタイプの意味でのものでした。

たぶん私は純粋なcについて私の質問を書くべきだった。とにかくありがとう。

編集:コードとタグをcに変更しました

役に立ちましたか?

解決

C99環境にいる場合、保証はまったくありません。浮動小数点数の表現は、§5.2.4.2.2で定義されていますが、それは論理的な数学的表現にすぎません。そのセクションでは、バイトの観点から浮遊点数がどのように保存されるかさえ言及していません。代わりに、脚注に書かれています:

フローティングポイントモデルは、各フローティングポイント特性の説明を明確にすることを目的としており、実装のフローティングポイント算術を同一にする必要はありません。

さらに、§6.2.6.1は次のように述べています

すべてのタイプの表現は、このサブクレスに記載されている場合を除き、不特定です。

そして、そのサブクロースの残りの部分では、浮動小数点タイプは言及されていません。

要約すると、a 0.0 All-Bits-Zeroとして表されます。

他のヒント

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

ポータブルではありません。ループを使用するだけです。 malloc戻り値をキャストする必要はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top