Casio Python - 10進数除算の出力と精度:高速素因数分解(7)

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - 10進数除算の出力と精度:高速素因数分解(7) 
目次


初版:2020/08/24
追記:2020/10/22

前の記事 - 12. 要素数の大きいリスト |  次の記事 - 14. CGモデルとFXモデルのPythonモードの違い


13. 10進数除算の出力と精度:高速素因数分解(7) <fx-CG50 OS3.40以降>

前回は、高速素因数分解スクリプト FactorG5.py (ver 5.0) と FactorG6.py (Ver 6.0) を作りました。
FactorG6.py (Ver 6.0) はスタック不足のために実行てきないことが分かったので、FactorG5.py (Ver 5.0) が前回の成果です。

高速素因数分解 Ver 5.0 - FactorG5.py のダウンロード

Ver 5.0 で色々な入力を試していると、仕様通りに動作しないケースが見つかりました。ここで仕様とは、Casio Baisc のプログラムとできるだけ同じ動作にすることです。

例えば、Casio Basic では、計算式を入力するとその計算結果が入力される仕様になっていますが、このようにならないケースが見つかりました。これは、Casio Pythonでの10進数計算の仕様が Casio Basic と異なっているのが原因だと分かりました。

Casio Python (Python) の仕様だから、このまま受け入れることは全く問題ないと思います。但し管理人自身の興味と趣味から、できるだけ Casio Basic でのプログラムと動作が互換になるように工夫して、FactorG7.py (Ver 7.0) を作ってゆきます。


13.1 Casio Python での除算結果のデータ型
    <fx-9750GIII, fx-9860GIII, fx-CG50 OS3.40以降>

FactorG5.py (Ver 5.0) を起動して入力する時、以下のようなことがあります。

1500_10_factor 

入力時に 120/2 とすれば 整数 60 が入力されるべきところ *must be integer とエラー表示されます。同様に 15000/10 とすると 整数 1500 が入力されるはずなのに 整数でないというエラーが表示されます。つまり現在のロジックでは、小数として認識されているということです。

そこで、シェル画面で 120/215000/10 を計算させてみると、以下のような浮動小数点表示になっています。

1500_10_calc 

数値演算は内部的には2進数で実行されているので、2の乗数を2で除算する例として 256/2 を計算すると 128.0 となります。

従って、Casio Python では、除算の結果は内部2進数演算とは無関係に、必ず浮動小数点型 (float型) で出力されることが分かります。そこで、入力ルーチンを変更して、小数点以下が 0 の浮動小数点を整数に変換して、整数入力と認識できるようにしようと思います。


13.2 Casio Python での関数計算結果のデータ型 <fx-9750GIII, fx-9860GIII, fx-CG50 OS3.40以降>

Ver 5.0 の入力で、関数を使った計算結果も浮動小数点になるので、それにも対応してみます。

200_log_factor 200_cos_factor 

200*log10(10) の計算結果は整数 200 になって欲しいのですが、Ver 5.0 の入力ルーチンでは小数と判定されています。

そこで、シェル画面でこの計算を実行してみます。

200_func_calc 

すると、両方とも 200.0 と小数になっています。
Casio Python では、関数計算の結果は浮動小数点型 (float型) になっていることが分かります。

従って、Ver 5.0 の入力ルーチンを 計算結果の小数点以下が 0 の時は整数に変換し、整数入力と判定するように変更します。


13.3 Casio Python での除算計算の精度 <fx-CG50 OS3.40以降専用>

Ver 5.0 で素数 821 を入力すると、素因数として 821 1つが得られます。 

821_factor 

では、821 が計算結果になる 1642/2 を式として入力すると、以下のように小数として認識されてしまいます。

1642_div_factor 

そこで、シェル画面で 1642/2 を入力してみると、以下の計算結果となります。

1642_div_calc 

Casio Python は、小数点以下13桁目が 1 になっており、誤差が抑制されていません。内部では2進数計算を行っているので、10進数計算には必ず誤差が伴います。多くの場合では誤差がうまく抑制されますが、誤差が現れたのが今回の事例です。

CPython ではこの誤差をうまく抑制しています。Windows 10 にインストールした Python 3.6.8 での計算結果は、下記のように誤差を抑制したうえで、浮動小数点型 (float型) で出力されていることが分かります。
CPython_1642_2

NoteWindows 版 Python のインストール
Windows版 Python をインストールすると、スタートメニューには PythonIDLE の2通りの 環境があります。上で示したのは IDLE 画面です。IDEL ではスクリプトをファイルに保存したり、保存したスクリプトを読み出して実行する機能があるので、管理人は CPython の学習には IDLE をよく使います。

さて、CPython では、PCの演算仕様によりますが、多くの場合は 53桁までの精度が確保されています。一方 Casio Python は15桁の精度しかありません。

Note浮動小数点演算 - その問題と制限 (Python 公式サイト) 参照

1642/2 の計算で誤差が表面化するのは、Casio Python の限界として、受け入れるしかなさそうです。


13.4 0 および負の整数入力時の処理 <fx-9750GIII, fx-9860GIII, fx-CG50 OS3.40以降>

オリジナルの Casio Basic プログラムでは 0 以下の整数入力をチェックしてエラーメッセージを出力し、そこでプログラムを終了しています。一方、Casio Python に移植したスクリプトでは、0以下の整数入力のチェックを行っていませんでした。うっかりしていました(^_^;

そこで、今回は 0 と負の整数入力をチェックして、エラーメッセージを出力したうえで、入力ルーチンを繰り返すように修正しようと思います。


13.5 入力ルーチンの修正

以下の Ver 5.0 の入力ルーチンを修正してゆきます。

while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if '.' in inp:
  print('*must be integer')
  continue
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   break
 else:
  continue


13.5.1 入力値が小数点以下 0 の小数の場合に処理を追加

if 文で最初に行っているのが、文字列中にコンマ . が含まれているかの判定で、ここで入力値が小数かどうかを調べています。そこで、この判定の前に、入力値の小数点以下が0の時は、入力値を整数に変換し、それを文字列変数 inp に格納する処理、具体的には以下の2行を追加します。

if frac(eval(inp))==0:
 inp = str(int(eval(inp)))


この2行の説明
変数 inp は、Input() 関数が返す値で、Input() 関数は文字列を返します。
eval()関数に 文字列変数 inp を渡すと、inp が計算式ならば、eval() 暗数はその計算結果を文字列で返します。
入力値が小数点以下 0 の浮動小数点型(float型) の数値とすると、数値から小数部を取り出す frac() に渡すと 0 を返します。 
frac() 関数はユーザーモジュール u.py で以下のように定義したものでした。
def frac(x):
 return x - int(x)

入力値が、小数点以下 0 の小数の場合は、
frac(eval(inp))==0 
True (真) となります。

これが成立するときに、小数表現の文字列 inp を整数表現に変換するため、以下のように記述します。
inp=str(int(eval(inp)))

結果出力の disp() 関数において inp 文字列変数の文字数から桁数を算出して表示しているので、ここで inp変数を更新しておく必要があります。

これまでに修正したスクリプトは以下になります。

while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if frac(eval(inp))==0:   ◀ 追加
  inp str(int(eval(inp)))  ◀ 追加
 if '.' in inp:
  print('*must be integer')
  continue
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   break
 else:
  continue


13.5.2 入力値が負の数値の場合の処理

inp は入力を文字列にしたものです。

inp にコンマ . が含まれるかどうかで、inp が小数かどうかを判定しています。そこで、小数かどうかの判定の if 文に続き elif 文で inp にマイナス記号 - を含むかどうかで、入力が負の数値かどうかを判定します。

 elif '-' in inp:
  print('*must be positive\n integer')
  continue


これを追加して、入力ルーチンは以下のようになります。

while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if frac(eval(inp))==0:
  inp str(int(eval(inp)))
 if '.' in inp:
  print('*must be integer')
  continue
 elif '-' in inp:                ◀ 追加
  print('*must be positive\n integer')  ◀ 追加
  continue                  ◀ 追加
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   break
 else:
  continue


13.5.3 入力が 0 の時の処理

Ver 5 の入力ルーチンを修正してこれまでに得られたスクリプトでは、入力が 0 以上の整数の場合の処理は、上で追加した elif 文の次に続く以下の部分です。入力の文字列 inp に小数点のコンマ . を含まず、負の記号 - を含まないとき、以下のように .isdigit() 関数を用いて数値であるかどうかを判定しています。

 elif inp.isdigit():
  if len(inp)>digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f=int(inp)
   break

inp.isdigit()True (真) の時、さらに文字列の長さが digit (15桁) を超える時は、15桁以内で入力するようエラーメッセージを表示したのち、入力ルーチンを繰り返します。15桁以内の場合は、else 節において文字列 inp を 整数 f に変換してから break により入力ルーチンのループから脱出し、素因数分解ルーチンへ移ります。入力ルーチンの中の if 文による条件分岐で、この時のみ break でループから脱出し、それ以外は continue でループを継続するようにしています。

さて、この else 節で行う文字列 inp を整数 f に変換するところで、入力が 0 の時の処理を行います。
f は整数変数なので、f が 0 でない時 (f != 0) は 適切な整数入力値だと判定し break でループを脱出、そうでない時は continue でループを継続するようにします。

具体的には、else 節に追記 (赤文字) して以下のようにします。

 else:
  f=int(inp)
  if f != 0:
   break
  else:
   print('*must be positive\n integer')
   continue


以上を反映した入力ルーチンを示します。

while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if frac(eval(inp))==0:
  inp str(int(eval(inp)))
 if '.' in inp:
  print('*must be integer')
  continue
 elif '-' in inp:
  print('*must be positive\n integer')
  continue
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   if f != 0:                  ◀ 追加
    break
   else:                    ◀ 追加
    print('*must be positive\n integer')  ◀ 追加
    continue                  ◀ 追加
 else:
  continue


以上で、Casio Basic 版とほぼ同じ入力仕様に修正できたと思います。


※ 高速素因数分解:15桁入力対応、Casio Baisc 版とほぼ同じ入力仕様版
  - FactorG7.py のダウンロード


fx-CG50 Pythonモード:高速素因数分解 - FactorG7.py
"""Sample script

 Exercise;
 ported from Casio Basic
 "Prime Factor 15 digits"
  factorG.py
   ver 7.0

 by Krtyski/e-Gadget
"""

from u import *
digit 
15
search 0

def disp():
 global aefz
 clear_screen()
 locate(00f3'm'0)
 locate(160': ' str(len(inp)) + ' digits'3'm'0)
 locate(16, 11, 'search:'+str(search), 2, 'm', 0)
 line(0,15,383,15,1,0)
 for i in range(115):
  if<= e:
   dx int(i/12)*16
   dy int(i/12)*11
   locate(0+dxi-dyz[i], 1'm'0)
   locate(10+dxi-dy'^('2'm'0)
   locate(12+dxi-dyz[i+21], 1'm'0)
   locate(15+dxi-dy')'2'm'0)
 locate
(00''0'm'1)


while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if frac(eval(inp))==0:
  inp str(int(eval(inp)))
 if '.' in inp:
  print('*must be integer')
  continue
 elif '-' in inp:
  print('*must be positive\n integer')
  continue
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   if f != 0:
    break
   else:
    print('*must be positive\n integer')
    continue
 else:
  continue

list(range(23))
for e in range(1,23):
 z[e0
0
f
int(sqrt(a))

prime_list [2,3,5,7,11]
for b in prime_list:
 search+=1
 d a/b
 if frac(d)==0:
  e+=1
  z[e] = b
  while 1:
   a int(d)
   z[e+21]+=1
   d a/b
   if frac(d):
    break
  c int(sqrt(a))
 ifcbreak


increment = \
[4,2,4,6,2,6,4,2,
 4,6,6,2,6,4,2,6,
 4,6,8,4,2,4,2,4,
 14,4,6,2,10,2,6,6,
 4,2,4,6,2,10,2,4,
 2,12,10,2,4,2,4,6,
 2,6,4,6,6,6,2,6,
 4,2,6,4,6,8,4,2,
 4,6,8,6,10,2,4,6,
 2,6,6,4,2,4,6,2,
 6,4,2,6,10,2,10,2,
 4,2,4,6,8,4,2,4,
 12,2,6,4,2,6,4,6,
 12,2,4,2,4,8,6,4,
 6,2,4,6,2,6,10,2,
 4,6,2,6,4,2,4,2,
 10,2,10,2,4,6,6,2,
 6,6,4,6,6,2,6,4,
 2,6,4,6,8,4,2,6,
 4,8,6,4,6,2,4,6,
 8,6,4,2,10,2,6,4,
 2,4,2,10,2,10,2,4,
 2,4,8,6,4,2,4,6,
 6,2,6,4,8,4,6,8,
 4,2,4,2,4,8,6,4,
 6,6,6,2,6,6,4,2,
 4,6,2,6,4,2,4,2,
 10,2,10,2,6,4,6,2,
 6,4,2,4,6,6,8,4,
 2,6,10,8,4,2,4,2,
 4,8,10,6,2,4,8,6,
 6,4,2,4,6,2,6,4,
 6,2,10,2,10,2,4,2,
 4,6,2,6,4,2,4,6,
 6,2,6,6,6,4,6,8,
 4,2,4,2,4,8,6,4,
 8,4,6,2,6,6,4,2,
 4,6,8,4,2,4,2,10,
 2,10,2,4,2,4,6,2,
 10,2,4,6,8,6,4,2,
 6,4,6,8,4,6,2,4,
 8,6,4,6,2,4,6,2,
 6,6,4,6,6,2,6,6,
 4,2,10,2,10,2,4,2,
 4,6,2,6,4,2,10,6,
 2,6,4,2,6,4,6,8,
 4,2,4,2,12,6,4,6,
 2,4,6,2,12,4,2,4,
 8,6,4,2,4,2,10,2,
 10,6,2,4,6,2,6,4,
 2,4,6,6,2,6,4,2,
 10,6,8,6,4,2,4,8,
 6,4,6,2,4,6,2,6,
 6,6,4,6,2,6,4,2,
 4,2,10,12,2,4,2,10,
 2,6,4,2,4,6,6,2,
 10,2,6,4,14,4,2,4,
 2,4,8,6,4,6,2,4,
 6,2,6,6,4,2,4,6,
 2,6,4,2,4,12,2,12
]

while 1:
 for i in increment:
  search+=1
  b+=ia/b
  if frac(d)==0:
   e+=1
   z[e] = b
   while 1:
    a int(d)
    z[e+21]+=1
    d a/b
    if frac(d):
     break
   c int(sqrt(a))
  ifcbreak
 ifc
break

if a 1:
 e+=1
 z[e] = a
 1
 z[e+11] = 
1

disp
()


13.6 完成した FactorG7.py の動作確認

120/2 と入力すると、計算値 60 が入力され、正常に素因数分解されます。
60_factor 

15000/10 と入力すると、計算値 1500 が入力され、正常に素因数分解されます。
1500_factor 

200*log10(10)200*cos(0) と入力すると、計算値 200 が入力され、正常に素因数分解されます。
200_factor 

1642/2 と入力すると、Casio Python の計算精度の制限により、計算結果が 821.0000000000001 となり、整数でないのでエラー表示の上入力ルーチンが継続されます。
1642_div_factor 1642_div_calc 

この問題は Casio Basic では発生しません。Casio Python の内部2進数演算が15桁の精度では、誤差が抑制しきれていないという仕様が明らかになりました。

[2020/10/11 追記]
但し、1642/2 と入力する代わりに Python の演算子を使って 1642//2 と入力すれば、その計算結果は 821 となるので、問題は解消されます。

なお、1642/2 と入力する必然性はなく、821 と入力すれば問題無く素因数分解できるので、大きな問題ではないと考えます。今後は、スクリプトの目的に応じて10進数の除算の誤差について留意する必要があります。




目 次

前の記事 - 12. 要素数の多いリスト

次の記事 - 14. CGモデルとFXモデルのPythonモードの違い





応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 


keywords: fx-CG50Pythonfx-9750GIIIfx-9860GIIIプログラム関数電卓

リンク集 | ブログ内マップ

関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

コメントの投稿

非公開コメント

Re: くだらないプログラムですが、ひとつ計算結果でました。

iron2様

管理人のやすです。

> 精度云々のベンチマークで有名な
> tan(355/226)の結果を出力してみました。
>
> -7497258.179141とでました。
> カシオの電卓で普通に計算すると
> -7497258.440となります。

私もやってみました。
精度良いですね!

Casio Python は15桁精度なので、10桁精度の内蔵関数計算よりも良い結果になったということですね。

面白い話題をありがとうございます。

くだらないプログラムですが、ひとつ計算結果でました。

iron2です。
管理人ん様、sentarou様、有志の皆々様
精度云々のベンチマークで有名な
tan(355/226)の結果を出力してみました。

-7497258.179141とでました。
カシオの電卓で普通に計算すると
-7497258.440となります。

キャノンのf-789sgだと
-7497258.185となり
一番真値に近い結果で
内部精度18桁のf-789sgには
及びませんが、カシオ機でも
キャノンに近い結果で精度を

高める事を確認できてうれしいです。
カシオパイソン入力は手間かかりますが、
魅力を感じます。

ちょとずつ、がんばります。
以上、失礼します。


空白はいりました。

iron2です。
空白はいりました。
ありがとうございました。

管理人様、sebtarou様、有志の皆々様

しばらくさわってないとほんとわからなくなります。
管理人様ほんとうにありがとうございました。
段落をどうするのか、今、又悩んでいます。
取り合えず、少し考えて頑張ります。
では、失礼いたします。

Re: 空白の入力の仕方ってどうしたらよかったでしょうか

iron2様、sentaro様、有志の皆々様


iron2様、

私もつい最近、虚数単位の i を入力するのに探し回ったところです。答えは意外なところにあるものです。
毎日電卓を触っていたとしても、久しぶりに使う機能や、特殊な記号などは、忘れてしまいますよね。


スペースは [A+PHA][.] です。小数点[.]キーの上に、赤文字で SPACE と印刷されているので、赤文字は [ALPHA]モードで入力するんだっけ、と思い出せるかも知れません。

ちなみに、小数点[.]の上には、黄色で = と印刷されているので、[SHIFT] [.] でイコール記号が入力できます。

空白の入力の仕方ってどうしたらよかったでしょうか

管理人様、sentarou様、有志の皆々様
iron2です。
リハビリがてらにグラフプログラム関数電卓fx-cg50でpythonを使って
遊んでいますが、いきなりスペースの入力方法を忘れていることに
築きました。
例えば、こういった局面です。
"coin 1:front 2:back"
この空白の入れ方を完全に忘却してしまい、途方にくれてます。
どうか、このあわれな私に教えてくださいませ。
よろしくお願いします。

fx-CG50のpythonでの浮動小数点数の文字列化

ちょっと気になったので、手元のPCのcpython(3.8.0)と比較しながらいろいろ弄ってみました。

fx-CG50の方で浮動小数点数の内部データを見る方法が無かったので、
◇math.frexp(): たぶん単純に仮数部と指数部を見るだろうという楽観視
◇* 2**整数: たぶん指数部だけを弄るだろうという楽観視
のもと、上の2つを活用しながらちょっとあれこれ浮動小数点数の計算を試した結果、
内部データ自体はcpythonと同じになっているようです。

違うのは計算結果の表示やstr()を使った時(たぶんどちらも同じ処理を通しています)で、cpythonは変に見えないようにいろいろ工夫をしているみたいです。公式のチュートリアルにも、昔のバージョンは表示が違った、みたいなことが書いてありました。で、たぶんfx-CG50の方はなんらかの理由で表記誤差が出てしまっている、ということのようです。

以下につらつら試したことなどを箇条書きしておきます。とっちらかっていてすみません。

fx-CG50にて >>> 821.0
その出力: 821.00…001

fx-CG50にて >>> 821.00…001 (←上の計算結果を選択してリターンでコピペ)
その出力: 821.00…001 (←同じようにしか見えない)

fx-CG50にて >>> 1642/2 == 821.0
その出力: True

fx-CG50にて >>> 1642/2 == 821.00…001 (←上同様にコピペしたもの)
その出力: False

fx-CG50にて
>>> a = 821.0
>>> b = 821.00…001 (←コピペ)
>>> a == b
その出力: False

浮動小数点数の内部データの見方
cpythonにて >>> (数字).hex()

fx-CG50にて >>> hex(int(math.frexp(数字)[0] * 2**53))
その出力: cpythonでの仮数部の表現から小数点を抜いた形(たぶん^^;)

fx-CG50にて >>> math.frexp(数字)[1] - 1
その出力: cpythonでの指数部の表現と同じ数字(たぶん^^;)

10進数計算の誤差について

K様

コメントありがとうございます。


> 整数でないものを入力された時に整数に変換して処理するというのは、ちょっと親切すぎるようにも思えます。

確かに、おっしゃる通りですね。

今回は、Casio Basic プログラムからの移植というお題で、Casio Basic の仕様上の動作を再現することを優先させようと考えました。古い設計の Casio Basic ですが、実用プログラムを作るには思いのほかよく出来ていて、Casio Python の仕様に大きな不満を持ちながら、その癖の理解と Python の勉強を兼ねて今の連載を進めています。なので、Casio Basic プログラムとの互換性確保へのバイアスがチョット高めに働いたようです。


> 商をちゃんと求めてくれる演算子を使ったり(1642 // 2)、int()で囲ったり、くらいはユーザ側に求めた方が、pythonをよりよく把握する助けにもなるのではないかと思います。

入力時に 例えば 1642//2 あるいは int(1642/2) とするのは、おっしゃるように Python 学習にはとても良い題材ですね。この点を、記事に追記しようと思います。


> あと、確かそうだったはずとしか言えないのが恥ずかしいのですが、pythonでの不動小数点数をstr()で出力した結果は、正確な値の近似値にしてしまうことがあったはずなので、例えは100.0と表示されていても内部ではぴったり100のデータになっていない、といったことがありえたはずです。
その時にはifで等しいかどうかの判定をするとFalseとなるのでわかります。(まあこの例はこのプログラムでは問題とはならないですね。)

これは意識していませんでした。良いアドバイスを頂き、ありがとうございます。

このあたりは、Casio Python で実験してみたいと思います。


> たしかfx-CG50でも0.1を足しまくったりした時に、表示上の値と実際に内部で保持している値が違ったことがあったのを確かめた記憶があるのですが、ちょっとあやふやです。申し訳ありません。

私は、CPython で以前実験したことがあり、誤差が蓄積されるのを経験しています。

最近は、CPyhton で Window を表示して 画像データを出力するなど、電卓を離れて CPython の感じを勉強中だったりします。現在は JSON シーケンスをPython で扱ってみることを試しているところです。

Casio Python と CPython の違いを体感しています。


いつも貴重なコメントをありがとうございます。

No title

1.0じゃなくて0.1です。
お目汚しすみません…

No title

整数でないものを入力された時に整数に変換して処理するというのは、ちょっと親切すぎるようにも思えます。
商をちゃんと求めてくれる演算子を使ったり(1642 // 2)、int()で囲ったり、くらいはユーザ側に求めた方が、pythonをよりよく把握する助けにもなるのではないかと思います。

あと、確かそうだったはずとしか言えないのが恥ずかしいのですが、pythonでの不動小数点数をstr()で出力した結果は、正確な値の近似値にしてしまうことがあったはずなので、例えは100.0と表示されていても内部ではぴったり100のデータになっていない、といったことがありえたはずです。その時にはifで等しいかどうかの判定をするとFalseとなるのでわかります。(まあこの例はこのプログラムでは問題とはならないですね。)

たしかfx-CG50でも1.0を足しまくったりした時に、表示上の値と実際に内部で保持している値が違ったことがあったのを確かめた記憶があるのですが、ちょっとあやふやです。申し訳ありません。
最新記事
検索フォーム
最新コメント
カテゴリ
C# (3)
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム電卓は、プログラムを作って、使ってナンボ!

プログラム電卓を実際に使って気づいたこと、自作プログラム、電卓での Casio Basic や Casio Python プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではなく、Casio Basicが面白いと感じる1ユーザーです。


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR