2009-07-23 17 views
0

私はいくつかの助けを使うことができます。数回の試行錯誤のイライラした日の後、私はNSUserDefaultsへのプリファレンスを書くことに一貫性のない結果を得ています。ここiPhone SDK NSUserDefaultsが正しい値を保存しない

コードの連続線である:

 NSLog(@"startTimer(): End Time defaults: %f\n", [defaults floatForKey:kEndTimeKey]); 
    NSLog(@"startTimer(): new End Time: %f\n", endTime); 
    [defaults setFloat:endTime forKey:kEndTimeKey]; 
    [defaults synchronize]; 
    NSLog(@"startTimer(): stored EndTimeKey: %f\n", [defaults floatForKey:kEndTimeKey]); 

kEndTimeKeyは、文字列定数です。

私はキーの現在の値を記録していますが、私は保存しようとしている値をログに記録し、同期してから、再度読み込みます。私には簡単なようだが、ここではデバッガ出力です:

2009-07-22 22:05:43.263 TimerTest3[1584:207] startTimer(): End Time defaults: 0.000000 
2009-07-22 22:05:43.266 TimerTest3[1584:207] startTimer(): new End Time: 270018630.916571 
2009-07-22 22:05:43.287 TimerTest3[1584:207] startTimer(): stored EndTimeKey: 270018624.000000 

私は元の値0、571で終わる意図した値、および6秒オフであるキャッシュから読み込まれた値を参照してください。

新しいデフォルトがどこから来たのか分かりません。何か案は?私はデバイスとシミュレータで同様の動作をします。

おかげ ブラッド

答えて

1

どのようにあなたがたendTimeを設定しています。それは二重ですか?私はこれがNSUserDefaultsの問題ではなく、浮動小数点数学の問題であることは比較的確信しています。

270018630.916571は、小数点以下16桁で、仮数を格納するために〜48ビットのデータを引き継ぎます。浮動小数点は32ビットですが、その1ビットは符号ビット、8ビットの指数、23ビットの仮数です。つまり、表示されている値が浮動小数点が保持できる値よりも大きく、失われた精度があると予想されます。たとえそれを270018630に切り捨てても、〜28ビットのパーシッションが表現されますが、これは整数よりも大きな増分で四捨五入する必要があることを意味します。

浮動小数点数では、同じビット数のintより大きな数字を魔法のように表現することはできません。彼らは、数字間のギャップを変化させ、それを追跡するためにメタデータ(指数)を使用して大きな数を格納する能力を作り出します。 Wikipediaは彼らの仕事のしっかりしたexplanationを持っています。

+0

私はあなたが正しいと信じています。ダブルスとして定義されているNSTimeIntervalsを格納しようとしていました。これは、なぜ機能が近いのか、他の機能には矛盾しているのか、少数の場合はうまく機能するのかを説明します。 –

関連する問題