• ベストアンサー

機械の扱える最も0に近い実数は?

プログラミング初心者です。学校の宿題をやっているのですが、実数の計算結果をファイルに書き出すと、10の-6乗よりも0に近い実数はすべて0.000000となってしまいます。 これは機械で扱える実数で最も0に近いのは10の-6乗だということでしょうか? それともこれはファイルに書き出す時だけの問題で、もっと0に近い実数でも計算途中では扱えるのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

C であれば、ヘッダーファイル limits.h に定数の定義があります。 実数の一番小さな値は、単精度なら FLT_MIN で、倍制度なら DBL_MIN で定義されています。 単に「単精度(浮動小数点数)」という場合には、IEEE 形式を指すのが普通ですが、IBM 形式も それなりにメジャーですので、一概に幾ら、とは言えません。 ちなみに、 > 実数の計算結果をファイルに書き出すと、10の-6乗よりも0に近い実数はすべて0.000000となってしまいます。 は、printf() で、書式指定を %f と精度指定をしないから、ですね。 %15.10f のように、精度指定をすれば、変数があらわすことができる範囲で詳しく出力されます。

marradona
質問者

お礼

ありがとうございます。勉強になります。

その他の回答 (2)

  • tomin
  • ベストアンサー率21% (18/82)
回答No.2

単精度ならば2^(-149)、倍精度なら2^(-1074)まで扱えます。 それぞれ10^(-45)と10^(-324)程度の大きさです。

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

プログラム次第です。何桁でも計算できるものもありますよ。

関連するQ&A

  • 実数の定数a

    高等学校の数学について質問です。 よく問題で、 「 (aの3乗) = 8 aは実数であるから a = 2 」 というのがありますよね。 この"aは実数であるから"という文句、ちゃんと書く癖はついたのですが、なぜ必要なのか分かりません。 教えてください。

  • 二次方程式の定数と実数解について

    数Iの宿題で困っています。だれか、次の問題のわかりやすい解説をお願いします 「xの方程式(m+1)x^2-2mx+2=0の実数解が1個であるように、定数mの値を求めよ。また、このときの実数解を求めよ」 と言う問題なんですが、答えのほうは 「m=-1のとき、実数解は-1  m=1±√3のとき、実数解は  -1±√3 と書いてあるのですが、自分で計算すると「m=1±√3で実数解は1/2」になってしまいます。 なんだか、やればやるほどよくわからなくなってしまいます。  どなたか、解説をお願いします

  • 複素数と実数が混在するように見える式について

    時系列解析で、自己相関係数のフーリエ変換がパワースペクトルになるというウィナーキンチンの関係というものがあります。その式では複素数が含まれているので、実数を入力として複素数が含まれている式で計算された出力結果は普通は複素数ということになります。しかし、自己相関係数は実数の系列で、パワースペクトルも実数になると思います(実部と虚部の2乗和なので)。実数に複素数を絡ませて変換して出てきたものが実数になるということになってしまいます。ここが理解できないのですが、どのように考えていくのでしょうか。絶対に虚部がゼロになるから、ということなのでしょうか。 一般にFFTによるスペクトル変換では実数列は複素数の実部にあてて変換する(例えば虚部はゼロにしておくとか)ので複素数から複素数を入出力するということで理解できます。 実際にプログラムでの処理を考えているので概念的な説明だけでは実装することできません。 なお、私は常に標準的なFFTでフーリエ変換しているので複素数での入出力ということなので実数となる系列では先に進めないという感じなのですが。もし出力が実数ということになったとき実部がそれ、虚部がそれ、実部と虚部の2乗和がそれ、というのならわかるのですが。 よろしくお願いします。

  • 指数・対数の大小関係について・・・

    学校の宿題なんですが、下の問題について教えて下さい。 『150の16乗と160の15乗とではどちらが大きいか。ただし、  log10底の2=0.3010,log10底の3=0.4771として計算せよ』   解答は150の16乗の方が大きい、ですが、そこへ至るまでの 過程がわかりません。2時間悩みました・・・。 どなたかお教え下さい。 よろしくお願いします!

  • 全ての実数xに対して、・・・

    教えてください。数学が苦手です。詳しく解説してくださる方、お願い致します。 問題 (1)全ての実数xに対して、 1=a(x-1)+b(x-2) が成り立つように、定数a,bを定めよ。 (2)1,2以外の全ての実数xに対して、 1/(x-1)(x-2) = a/x-2 ;+ b/x-1 が成り立つように、定数a,bを定めよ。 (3)1,3以外の全ての実数xに対して、 2/(x-1)(x-3) = 1/x-3 - 1/x-1 が成り立つことを確かめよ。 (4)1,2,3以外の全ての実数xに対して、 2/(x-1)(x-2)(x-3) = a/x-1 + b/x-2 + c/x-3 が成り立つように、定数a,b,cを定めよ。 途中の基本的な考え方とかも書いていただけるとうれしいです。 解説いただけるかたのみ、コメントお願いいたします。

  • 実数

    (ア) すべての実数xに対して (x^2 +x+a)^2 -(bx+c)^2=x^4 +2x^3 -11x^2 -28x-12が成り立つとき、a,b,cを求める。 ただしa,b,cは有理数とする 答a=2,b=±4,c=±4 (イ) x^4 +2x^3 -11x^2 -28x-12=0を解く 答x=-2、-3、(3±√17)/2 よろしくおねがいします この問題は恒等式を利用するそうですが、いろいろと試したのですが計算をすればするほど複雑な式になってどんどんわからなくなってしまいました。 おねがいします

  • 実数と自然数は同じ個数なのではないでしょうか?

    すべての自然数とすべての実数を1対1で対応させる(すべての実数を一列に並べる)方法を考えました。間違いがあれば教えてください。 *方法1*「後出し」は実数の専売特許にあらず まず、すべての自然数と、異なる実数を無限に並べたもの、とを対応させるのだが、それは、異なる実数を無限に並べた「第一列」の「一番目」の実数を「1・1」とすると、 1→1・1 2→1・2 3→1・3 ・ ・ ・ と表すことができる。これはいわゆる「すべての自然数とすべての実数を1対1に対応させたと仮定したもの」であり、対角線論法によってこの表には存在しない実数を作れることから、仮定は間違い=「実数は自然数より多い」という結論になるのが従来の話である。しかしこれは、自然数を対応させる対象を「第一列」に限定したことによる間違った結論だ。 対角線上の数字のずらし方は、すべて一つずらす1111…の他に、1211…,1234…,2624…と無限にあるので、一つの対角線から、「第一列」には存在しない実数を無限に生み出すことができる。対角線論法によって生み出された無限の実数を並べた「第二列」に自然数を対応させることができなければ先の結論は正しいことになるが、そんなことは全然なく、「第二列」の「一番目」の実数を「2・1」とすると、 1→1・1 2→2・1 3→1・2 4→2・2 5→1・3 6→2・3 ・ ・ ・ のように、始めの、自然数と「第一列」の対応を解消した後、あらためて自然数を、「第一列」と「第二列」に、交互に対応させればいいだけの話なのだ。で、これは、「第一列」と「第二列」を合わせて「新たな第一列」にした(=始めの状態にリセットした)ということであり、この「新たな第一列=N1」の対角線から、対角線論法によって「新たな第二列=N2」が生まれるので、そしたらまたそれまでの対応を解消して 1→N1・1 2→N2・1 3→N1・2 4→N2・2 5→N1・3 6→N2・3 ・ ・ ・ と、自然数を「新たな第一列」と「新たな第二列」に交互に対応させ、これを無限に繰り返せばいいのである。自然数を、「新たな第二列」の実数に、無限に対応させ続けることができるということは、すなわち両者の個数は同じということなのである。 それにしても、無限に生み出される「新たな第一列」と「新たな第二列」は合わせて「新たな第一列」にできるのに、なぜ始めから一列に並べることができないのか。 方法1を別の言い方でまとめると、まず 1→1・1 2→1・2 3→1・3 ・ ・ ・ のように、すべての自然数と、異なる実数を無限に並べたもの、とを対応させるところから始めて、次に 1→1・1 2→  ←2・1 3→1・2 4→  ←2・2 5→1・3 6→  ←2・3 ・ ・ ・ と、「第二列」の実数を「第一列」に割り込ませて、始めの、すべての自然数と、異なる実数を無限に並べたもの、とを対応させた状態 1→1・1 2→2・1 3→1・2 4→2・2 5→1・3 6→2・3 ・ ・ ・ ↓ 1→1・1(1・1) 2→1・2(2・1) 3→1・3(1・2) 4→1・4(2・2) 5→1・5(1・3) 6→1・6(2・3) ・ ・ ・ にリセットして、そしたらまた 1→1・1 2→  ←2・1 3→1・2 4→  ←2・2 5→1・3 6→  ←2・3 ・ ・ ・ と、「第二列」の実数を「第一列」に割り込ませて…とこれを無限に繰り返す、といった具合に説明することができる。 *方法2*実数を整列させる 方法1は「動的な対応」とでも言うべきものであり、できれば「静的な対応」が望ましいわけで、そのためには実数を整列させる必要があるのだが、以下のようなやり方ではだめなのか。 まず 1→0.1 2→0.2 ・ ・ ・ 9→0.9 10→0.01 11→0.11 12→0.21 ・ ・ ・ 99→0.99 100→0.001 101→0.101 102→0.201 ・ ・ ・ 9999→0.9999 10000→0.00001 10001→0.10001 10002→0.20001 ・ ・ ・ …835218→0.812538… …835219→0.912538… …835220→0.022538… ・ ・ ・ というように、すべての自然数と、0と1の間のすべての実数を、1対1に対応させる。右側が「0と1の間のすべての実数」であることに異論はあるだろうか。この列に存在しない(0と1の間の)実数は存在するのか。この列は、小数第一位の数字が1,2…9,0,1…9,0,1…となっているので、だいたいその値で推移しながら、実数が、0と1の間を無限に埋めていく形になっている。 例えば、小数点以下、一恒河沙の一恒河沙乗番目が2、一阿僧祇の一阿僧祇乗番目が3、一那由他の一那由他乗番目が4の 0.1…2…3…4… のような無理数について、この並びの途中までのものしかないとしたら、ではどこまでのものならあるのか。0.1…2か、0.1…2…3か、0.1…2…3…4か。実際には「途中まで」などということはなく、つまりこの列にこの無理数は存在し、この任意の無理数が存在するなら(0と1の間の)すべての無理数が存在するのである。で、この表は左右が対称的になっているから、右に無限小数が存在するなら左には無限桁の自然数が存在するのである。 有限桁の自然数を重複することなく無限に並べることができないのと同様に、有限小数を、重複することなく無限に並べることはできない。この列は0と1の間の実数を整列させたものであり、この列に存在しない(0と1の間の)実数は存在しない。 で、すべての実数を整列させると 0,0.1,0.2…0.9,0.01,0.11,0.21… 1,1.1,1.2…1.9,1.01,1.11,1.21… 2,2.1,2.2…2.9,2.01,2.11,2.21… ・ ・ ・ (0),-0.1,-0.2…-0.9,-0.01,-0.11… -1,-1.1,-1.2…-1.9,-1.01,-1.11… -2,-2.1,-2.2…-2.9,-2.01,-2.11… ・ ・ ・ となるので、すべての自然数とすべての実数を1対1に対応させると、 1→0 2→0.1 3→-0.1 4→1 5→-1 6→2 7→-2 8→1.1 9→-1.1 10→0.2 11→-0.2 12→0.3 13→-0.3 14→1.2 15→-1.2 16→2.1 17→-2.1 18→3 19→-3 ・ ・ ・ のようになる。 ところでそれでも従来の考えが正しい場合、循環小数と非循環小数の個数に差が出る本質的な原因、両者の違いは何なのか。明確な違いは「整数比で表せるか表せられないか」だが、循環小数と非循環小数をそれぞれ循環数列と非循環数列に置き換え(今問題にしているのは個数であり、小数点を取り除いても個数は変わらない)れば整数比は関係なくなるわけだし。単なる数字の組み合わせに過ぎない同じ無限数列でありながら、循環させないというだけで個数が多くなるというのは何とも妙な話である。

  • たぶん初歩の問題ですが。。。

    短大のプログラミングの授業で、問題が出されました。 『斜辺の長さが50以下で、3辺の長さがすべて整数の直角三角形となる場合は何通りあるかを計算させる処理を書きなさい。ただし、同じ数値の順番だけが違うものは一通りとします。 ヒント:Cを斜辺とする三角形A、B、Cは次の条件を満たしています。     Aの2乗+Bの2乗=Cの2乗 (2乗の書き方が分かりませんでした。ごめんなさい) 50以下のすべての3つの正の整数の組み合わせについて、この式が成り立っているかどうかを調べる。同じ数値の順番だけが違うものを除くにはどうすればよいかを考えてください。』 という問題なんですけど、ぜんぜん分からないんです(><)汗汗 いくら考えても、どう考えていいか全然分かりません。。。 プログラミング超初心者なんですけど、誰か教えて下さい!!

  • 関数について

    vbの超初心者です。 しょうもない質問ですが、回答お願いします。 プログラミングにおいて計算(関数)は絶対的に必要になりますよね 実際、僕も必要になったのですが、計算式に入る実数についての質問です。 計算式の途中に実数を入れるにはどうしたらよいでしょうか? 例えば「テキストボックスに入力された数字に100をかける」みたいな感じです。 普通に*100とすると実数の後にはコロン(:)が必要と出てくるのですが、それをつけると*の下に波線がつきビルドエラーになってしまいます。 上級者から見れば常識の様なことかもしれませんが何卒よろしくお願いします。

  • 高一 数学 高次方程式

    高一 数学 高次方程式の問題です! やってみたのですが解けないので、途中計算と答えをお願いします(-_-;) 三次方程式 x三乗+ax二乗-2x+b=0の1つの解が1+√3iであるとき、実数a、bの値を求めよ。また、他の解を求めよ。 という問題です! 三乗とかルートとか書き方が分かりませんでした… 見づらく分かりにくいと思いますがお願いします!

専門家に質問してみよう