Memset(ary、0、length)は、二重配列でゼロを入力するポータブルな方法です[複製
-
05-10-2019 - |
質問
次のコードでは、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戻り値をキャストする必要はありません。
所属していません StackOverflow