HOME»応用情報技術者試験掲示板»単純な計算問題の質問です
投稿する

単純な計算問題の質問です [4814]

 八王子さん(No.1) 
https://www.ap-siken.com/s/kakomon/20_haru/q3.html

すごい馬鹿な質問かもしれません。

この問題の解説ですが、なぜ

100-100.004999=0.005001

となっているのでしょうか?
100から100より大きい数字を引いたらマイナス値になる気がするのですが…
2024.02.04 21:27
立川さん(No.2) 
けた落ちは、浮動小数点形式で表現された "絶対値" の非常に近い値同士の減算や、~

絶対値!
2024.02.05 14:02
yukkymouseさん(No.3) 
√(x+1)-√xで、x=10000のときの話をしてるんですから、
√10001-√10000≒100.004999-100=0.005001
で、単純に解説の誤記でしょう。
2024.02.05 20:53
 八王子さん(No.4) 
ん?
100.004999-100=0.005001
にならなくないですか?

100.004999から単純に100引いたら少数だけ残って0.004999になりせん?
2024.02.05 23:22
納豆のたれさん(No.5) 
√(x+1)-√xで、x=10000のときの話をしているので
√10001-√10000≒100.004999-100
なのですが、引かれる数と引く数を取り違えて
√10000-√10001
になってしまっています。
さらに計算している内容は
101-√10001
となっているようです。

得られる答えは0.005001ではなく、
  0.005000 ←まるめ処理が四捨五入の場合
  0.004999 ←まるめ処理が切捨ての場合
有効数字8桁と説明しているけれど、9桁のような気も

x には平方数ではない数字を選んだほうがよかったのかなと思います。
2024.02.05 23:46
 八王子さん(No.6) 
↑納得しました。
私の頭がおかしくなったしまったのかと思いました。ありがとうございました。
2024.02.06 04:28
boyonboyonさん(No.7) 
AP シルバーマイスター
この投稿は投稿者により削除されました。(2024.02.06 16:56)
2024.02.06 16:56
boyonboyonさん(No.8) 
AP シルバーマイスター
>スレ主様
締めを書き込まれた後で恐縮です。
こちらのスレに興味を持ったのでいろいろ考えてみました。
ちょっと時間がかかったので、タイミングが遅くなってしまいました。
???な所はありますが、思いついたことを書かせていただきます。

「単純な引き算の順番間違えなど解説には載らないだろう」というのが始まりです。

気づいたこと
・解説に(10進数で説明していますが実際には2進数の計算です)と書いてある。
・√(10000)=100は、2進数でも10進数でも成り立つ。
  2進表記  √(10000)を10進表記に直して√(16)=4  2進表記に戻して100

○先頭が1の時は、補数表現と考えると・・・
・10000と10001は、2の補数だと考えると絶対値は、10000の方が大きい。
  -16 と -15
・絶対値で見れば、x=10001の絶対値,x+1=10000の絶対値と考えられる。 
・100,100.004999も補数と考えると絶対値は、100の方が大きい。
  -4 と -3.995001 かな?
  絶対値で計算すると
  4-3.995001=0.004999
  解説とは違う???

・10000と10001を2進数として平方根を求めると
  √(10000)=100
  √(10001)=100.00100000100001 これくらいで・・・・

補数とみると
100.00100000100001  の絶対値は、
 11.11011111011111
100から引けば、0.00100000100001
1.00000100001x2^-3 元から3桁落ちです。

かなりヘンテコな考え方です。自分でもよくわかりません。解説の答えとも違っているし・・・
お詳しい方がいたら、ご教授をお願いしたいです。
2024.02.06 17:20
納豆のたれさん(No.9) 
10001と10000を2の補数だと考えると、√10001と√10000は虚数です。

100.004999 が -3.995001 ということは....
小数点の前は2進数で小数点の後ろは10進数なのでしょうか

浮動小数点フォーマットは、符号+仮数部(絶対値表現)+指数部(下駄履き表現)のはずなので補数表現は使わないと思います。
2024.02.06 20:00
boyonboyonさん(No.10) 
AP シルバーマイスター
>納豆のたれさん
こんばんは、いつもお世話になっています。
ご質問の件返信いたします。

>10001と10000を2の補数だと考えると、√10001と√10000は虚数です。
補数は、負の数ではありません。引き算を足し算で済ませるために考えたものです。PCに√10000を計算するように命令すれば、計算を実行して100を出力するだけです。

引き算の例(4ビットの場合:合計16になるようにします。)
6-3を2進数でやってみます。3の補数は13
0110-0011→0110+1101=10011  mod16で、0011=3
3-6を2進数でやってみます。6の補数は10
0011-0110→0011+1010=1101 人間の解釈で-3とする。
ですが、見方を変えれば
0110+1101=10011は、6+13=19
0011+1010=1101は、3+10=13
にもなります。
PCがやっていることは、ビット列を加算しているだけで、意味づけは人間がしていると思っています。

>100.004999 が -3.995001 ということは....
>小数点の前は2進数で小数点の後ろは10進数なのでしょうか
これはその通りで、解説の
>10進数で説明していますが実際には2進数の計算です
から、小数点以下を10進数にしてやりました。
後半では、2進数で通してやってみました。

>なぜ、100-100.004999=0.005001
がこのスレのテーマだったので、これを成り立たせるにはどうしたらいいかいろいろ考えて補数を使うことを思いつきました。
はっきり言って、いいのか悪いのか自分でもよくわかりません。なんとなく辻褄はあっているかなーー。くらいの気持ちです。

桁落ちの理解には、
√10001-√10000を10進数で普通に計算すれば、いいと思います。
2024.02.07 01:37
納豆のたれさん(No.11) 
No.8で、
>・10000と10001は、2の補数だと考えると絶対値は、10000の方が大きい。
>  -16 と -15
ご自分で負の数だと言っちゃってるような気がするのですが、それは置いといて....

実際にプログラムを作って倍精度の浮動小数点数の内部形式を確認しました。
それぞれ1行目が小数形式、2行目が指数形式、3行目が内部形式です。
10001.000000 ←(x+1)
1.000100e+004
40c3888000000000

10000.000000 ←x
1.000000e+004
40c3880000000000

100.005000 ←sqrt(x+1)
1.000050e+002
40590051eafee8b3

100.000000 ←sqrt(x)
1.000000e+002
4059000000000000

整数(固定小数点数)と浮動小数点数はまったく異なります。
2024.02.07 23:39
管理人(No.12) 
ご指摘ありがとうございます。
遅くなってしまい恐縮ですが、以下のように訂正しておきました。

100.004999-100=0.004999 → 4.999×10^-3
2024.02.22 00:34
返信投稿用フォームスパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
© 2010-2024 応用情報技術者試験ドットコム All Rights Reserved.

Pagetop