プロが教える店舗&オフィスのセキュリティ対策術

説明のしかたが下手で申し訳ないのですが

double型の数値で0.999999999999......と続く数値があったとして、この数値が1.0として扱われるのは小数第何位からですか?

また、1.0に近似してほしくないときはどうしたらいいですか?
C#でプログラミングをしています

A 回答 (3件)

やろうとしていることは


lim_(x→0) f(x) = 1
で、 xを0に近付けつつ、f(x) を計算する、という感じなのでしょうか。


方法は3つあります。
(1) 計算式を工夫する。
0.999... だと 10^-15程度までしか正しくありませんが
0.000 .... 1 → 1.0 * 10^-n だと、10^-nの桁から15桁程度までの精度があります。
式を工夫して、計算結果が1ではなく、0に向うようにすることで、精度よく計算できるかもしれません
例)
g(x)=1-f(x) を求める。 ※「桁落ち」に注意


(2)十分な精度のある型を使う
https://ja.wikipedia.org/wiki/%E4%BB%BB%E6%84%8F …
自作するか、既存のものを使う


(3)計算自体に意味があるのか、考えてみる。
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます!いろいろ工夫してみます!

お礼日時:2017/09/07 12:13

https://ja.wikipedia.org/wiki/IEEE_754

C#というか、.NET Frameworkで使われてるのは、IEEE754形式の浮動小数点数です。
二進数で表現されています。
10進数でキリがいいように見えても、二進数小数にすると無限小数になる、というのがよくあります。
それを有限の桁におさめるため、誤差が発生します。

精度が15桁というのも、2進数での丸めが発生する桁を10進数に換算した場合のものです。
それ以上の桁がまったく無い、というわけではありません。

実際、1に最も近い値は
0.99999 99999 99999 88897 76975 37484 34595 76368 33190 91796 875
になります。これは、正確な値で誤差はありません。
これと、1.0の間の値、というのは存在しません。間の値は、1.0か上記値かに丸められます。
a=0.99999 99999 99999 94
としても、
a = 0.99999 99999 99999 88897 76975 37484 34595 76368 33190 91796 875
なってしまいます。


> また、1.0に近似してほしくないときはどうしたらいいですか

その目的は何でしょうか?
上記のように、 aを決めて
 1.0 != a
だとしても、それを計算の中で使うと
 x * 1.0 == x * a (つまり、1.0 == a に相当)
となってしまうことも考えられます

どんな目的でそうしたいか、によって、対策も違います。
    • good
    • 1
この回答へのお礼

ある値を限りなくゼロに近づけるようにループ処理で計算をしているのですが10^(-20)くらいの桁まで計算させたいんです...友達や先輩に聞いても解決できなかったので...

お礼日時:2017/09/06 22:37

処理系によります。


例えば、Visual C++だと15桁。

データ型の範囲
https://msdn.microsoft.com/ja-jp/library/s3f49kt …

> この数値が1.0として扱われるのは小数第何位からですか?

なので、16位とかって事になるのでは。


> また、1.0に近似してほしくないときはどうしたらいいですか?

有効桁数内で処理して下さい。

#define NUM99 0.999999999999999

とかとでもしとくとか。
    • good
    • 0
この回答へのお礼

ありがとうございました!有効桁内でやりくりするしかなさそうですね...がんばります!

お礼日時:2017/09/06 22:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!