実体配線図
今、電子工作(あくまでも、オイラー流のね)に夢中になってるせいか、カンタン電子工作! 『初めてのラズベリーパイ』(日経BP)なんてのに、思わず目がいった。
一体この手の小供向け(?)ムック本って、幾らぐらいするの? 借りてきて読んでるんで、普段は気に ならないんだけど、何故か裏表紙に眼が行ったのさ。何と、1111円(税別)ですって。 この1111って、狙ってつけた値段? いかにも、その手の業界人が好みそうな設定だな。
初めて、Scratchとか言う、ジグソーピースを並べて行く言語の例を見たぞ。 プログラムの一番最初には、緑の旗がクリックされた時って書かれたピースを置く 約束。ふーん、起動宣言だな。ずっとって書かれたコの字型のピースがある。 この中に、各種ピースを入れ込んでいく。ずっとってのは、while trueだな。 もし□なら、ってのは if式か。何だか、こっちの方がpython語よりは疲れそう。
で、お決まりはLチカ。部品代が載ってた。ブレッドボードは、1枚220円(千石マーケットならぬ電商での価格) ブレッドって食パンの事だな。ちょっと高級な食パンは、同じぐらいの値段ですよ。 赤色LEDは32円、抵抗は6円、オスーメスジャンパー線(10本セット)で380円。 抵抗よりジャンパー線の方が高いんか。世界に誇る青色LEDは幾らするんだろう?
おお、人感センサーを使って、デジタルサイネージにも挑戦してる。要のセンサーは、 焦電型赤外線センサーモジュールってのが正式名称みたい。秋月で400円とな。 物価の実体が分かって、興味深いな。このセンサー、人が居る・居ないをTTLレベルで 出力してくれるってな。まさに電子工作用部品だ事。
豊富な写真が載ってて、これが現代版の電子工作か。オイラーみたいに、ウンウン唸る 部分がなくて、誰にでも簡単に出来そう。その気にさせる、日経リナちゃんだか、 ソフトウェアのまとめ本でした。作者は、2度美味しいんでしょうな。
スクラッチの兄弟は、どうやら、こちららしい。ブラウザーだけで、試せるぞ。
iPhone6sだけでプログラミングできる『MOONBlock DX』が11月10日から配信開始
pythonのprint関数
python3のprintは文ではなく、関数。ゆえに括弧は必須。頼みもしないので、自動的に 改行が行われる。
前回の宿題、Python3でg形式の数値を、素人に馴染みのある浮動小数点表記にするには どうするかって考えて(調べて)みた。
普通に考えたら、そりゃ、printfでしょ。そんな関数は無いそうです。ipython3がそう言って くるんですから、そうなんでしょう。
しょうがないので、7. 入力と出力 を参照。やり方は2つなるとな。
古い人間用には、
In [1]: v = 5.965056e-02 In [7]: print("%10.3f" % v) 0.060
新しい方式では
In [12]: print('{0:10.3f}'.format(v)) 0.060
古い人間が新しい作法をキャッチアップするための、まとめをされてる方が おられたので、頭の片隅にたたきこんでおこう。
Python3の文字列について。%記法とformat()記法の対応関係
リバース・エンジニアリング
もう一丁、前回の記事で書き忘れていた事が有った。理想OPAMPのネットリストを 見て、回路図をどうやって妄想するか?
* + - out .subckt opamp 50 51 55 rin 50 51 1G cin 50 51 5p e1st 52 0 50 51 100000 r53 0 52 1g r51 52 53 100k c51 0 53 53n d51 56 53 d1s2075 d52 53 57 d1s2075 v51 56 0 -13.7V v52 57 0 13.7V r52 53 54 1k c52 0 54 53p d53 58 54 d1s2075 d54 54 59 d1s2075 v53 58 0 -13V v54 59 0 13V eout 55 0 54 0 1 rpow 55 0 1G .model d1s2075 D .ends
部品の数だけ行数が有る配線リスト。まずは、基盤に付いている部品種類に着目。 目立つ所では、4つの電源。4つのダイオード。後はCとR。
次は、部品番号。設計した人がまともなら、若い番号が入力の上流にきて、番号が大きく なるにつれ、後ろの段になる。Bugが出て、欠番になる事がある。追加になる事もある。 その場合は、番号を飛ばして追加するだろう。(希望的観測)
次は、部品定数。極端に大きいCは、電源のバイパスコンデンサか、低周波の信号が流れる ライン。容量が小さいと高周波系だ。数pのコンデンサは、まれに発信防止とか、回路の 本質に寄与しない場合が多い。
抵抗は、値が一般的じゃ無いものは、時定数とかを決めている事が多い。あれ? 時定数って、 Cとセットじゃん。Cは誤差が大きい事が普通。大数の法則で、表示の近辺に実測地が集中 するって看做して、誤差の少ない抵抗で辻褄を合わせる事が多い。
と、こんな事に注目しながら、プリント板のリバースエンジニアリングを行って行く。 でも、今回は、接続情報が数字主体でしょ。どうする?
数字を意味のある変数名もとえ、信号名に置き換えていく。こういうのは、editorで、 一括置換するのが間違いない。
実体配線図
上のリバース・エンジニアリングは昭和の臭いがする古びた技術。今なら、プリント基板を 写真に撮って、OpenCVとかで、部品の自動割り出し。基盤の表裏の配線から、スルーホールの 貫通を自動検出。それらを踏まえて、配線図の自動作成ぐらいは出来そう。
こういう事はググル様が持ってる、人口知能のコンピュータを使えば、容易に出来そう。 なんだけど、貧乏人のオイラーには、そんな設備を使う事は許されない。
ならば、もどきを見つければいいんでないかい。*spiceが扱っているネットリストを元に 回路図を起こすソフトが有りそう。探してみた。そして撃沈した。 回路図をcadで描いて、それからネットリストを作るのは多数見つかるんだけど、その逆は 見つけられなかった。
そんなもの、世の中に存在しないのかも知れない。sha1みたいに、一方向関数は、容易に 書けるけど、逆は(ほぼ)不可能ってんで、誰も手を出さないんだろうね。あるいは、 需要が無いのか。そもそも、リバース・エンジニアリングの世界だからなあ。 言ってみれば、ダークな世界。公然とは公開出来ない訳よ。
そう言えば、昔のソ連。電子技術が西側諸国に比べて著しく遅れていた。ミグだかの 戦闘機に乗って亡命してきたパイロットがいた(昭和何年だっけかな)。これ幸いと ばかり、ミグ戦闘機を押収。詳しく調べてみたら、電子機器に真空管が使われていたとか。
やっぱりソ連の電子技術水準は遅れていると、嘲笑の種にされた。今思えば、半導体は 妨害電波等に弱いので、わざと真空管を使ったとも解釈出来る。
それはさておき、ソ連の技術者はマイコンを手に入れて、ICのパッケージを引っ剥がし、 ICの配線図をコピー。何層にもなっているんで、一層ずつ引っ剥がしながら、配線図を コピーして、最終的には、コピーICを作り出しちゃったとか。ね、リバース・エンジニアリングって、 ダークな裏の世界の秘め事でしょ。
で、オイラーは、ネットリストから配線図を作りたい訳よ。その用途は?そうさな、 ltspiceでマウスをぐりぐりして配線図なんて書きたくない。リナちゃんの上で、 ネットリストをえいっとemacsかなにかの手に馴染んだeditorで書きたい。
それはいいんだけど、配線間違いとか配線忘れを検証するツールが欲しい。そこで、 逆変換して回路図を作成し、チャックできたらねって思う訳。あるいは、公開されてる ネットリストを検討したいとかの時も使えそう。
はて、どうやる? 閃いたのはグラフソフトですよ。この場合のグラフって、折れ線とか 棒グラフを描くgnuplotとかとは違うで。数学的なグラフ。接続情報を扱う分野。
しばらく前に、租税回避地のブローカーの事務所の膨大な資料が八苦され、それが マスコミによって公開された。 この資料の解析に使われたのが グラフソフトだ。どの会社とどの会社が繋がってるとか。人脈とかを、分かり やすい図にしてくれるやつだ。
フリーで有名なのに、Graphvizってソフトが有る。これが使えないかな。昔やった事が あるけど、改めて調べてみた。
そして、実証実験してみろ。妄想だけじゃ、何の役にも立ちませんから。
ネットリストをdot語に変換する。そしてそのソースをgraphvizのアプリに喰わせて、 pngファイルを作成する。後はそれを表示。unixで使える画像表示ソフトと言うと、xvしか 知らない。取り敢えず、firefoxに喰わして表示させればいいだろう。そんなに煩雑に 使う訳でも無いしね。
その流れをMakefileにまとめておいた。最近はshellスクリプトを書くより、こちらの 方が手軽ですから。それにemacsからも簡単に実行出来るしね。
dot: ./see.py > z.dot dot -Tpng z.dot -o z.png firefox z.png wa: ./see.py > z.dot circo -Tpng z.dot -o zz.png firefox zz.png
部品の配置は、おまかせです。運次第です。人間が配置を決定出来ませんってのが基本。 でも、circoなんてのを使うと、部品を円形に配置した上で線を結んでくれるようになる。 他にも、配置を大雑把に変えられるけど、凝ってもしょうがない。
円形配置と言えば、世界初の成功したスパコンCRAY-1が思い出される。高速性が命なんで、 それぞれのモジュール間の距離が最短になるように考えたら、きょう体が、円筒になり ましたってやつ。おまけに円筒の回りには、プログラマーが休めるように椅子が 配置されてる。この椅子はサービスで付けた訳ではなく、電源と冷却機の収納場所 だったそうな。
ネットリストをdot語に変換するのはPython3にやらせた。最初全てをpython内で行う 積もりでいたんだけど、unixの流儀を思い出したんで、変換だけにしてある。see.pyって それらしい名前は、揺れ動く心のなごりです。(スクリプトか巻末に掲示)
実例を、先の理想AMPの回路で示そうと思ったけど、あれは電圧制御の電源が出て来る。 4端子の部品は、まだ組み込んでいないので(なんせ、実証実験の試作品ですから)、 別のものにする。前回のpsnのネットリストの一部を使った。
sakae@ub:~/gr$ cat a.cir Vcc N001 0 12v Vin N004 0 AC Q9 Aout N005 N007 2SC1815 Q10 Bout N006 N007 2SC1815 R1 N001 Aout 1k R2 N001 Bout 1k R3 N001 N006 330k R4 N001 N005 330k R5 N007 0 510 C1 N005 N004 10u C2 0 N006 10u
オリジナルでは、電源の所が
Vin N004 0 AC 0.1v
になってたけど、スクリプトの都合上、少々変形した。それも含めて、入力ファイル名は、 z.cirって固定な名前にしてる。オリジナルから、z.curって名前でコピーし、適当に 動くように変更しろって、スタンス。オリジナルを無変更で使えるようになるのは何時だ?
sakae@ub:~/gr$ cat z.dot graph basic { graph [size = "14, 12"]; gnd [shape = invtriangle, label = "ground"]; node [shape = record ]; Vcc [label = "<N001>N001|Vcc(12v)|<0>0"]; Vin [label = "<N004>N004|Vin(AC)|<0>0"]; Q9 [label = "{Q9(2SC1815)|{<Aout>Aout|<N005>N005|<N007>N007}}"]; Q10 [label = "{Q10(2SC1815)|{<Bout>Bout|<N006>N006|<N007>N007}}"]; R1 [label = "<N001>N001|R1(1k)|<Aout>Aout"]; : Q9 : N007 -- Q10 : N007 ; Q10 : N007 -- R5 : N007 ; Vcc : 0 -- Vin : 0 ; Vin : 0 -- R5 : 0 ; R5 : 0 -- C2 : 0 ; C2 : 0 -- gnd ; Vin : N004 -- C1 : N004 ; : R3 : N001 -- R4 : N001 ; }
gndってのは、オイラーが意識的に入れた部品。唯一の1端子を持つやつだ。これ、グランドの略。 よく電気/電子業界ではアースするって言うけど、アースって地球の事ね。
母なる地球、母なる大地はどっしりして安定。電気の基準を大地にしましょって事で、 地中深くアース棒を打ち込み、そこに回路の一端を接続する。このアースは極めて重要で、 第一種接地とか第二種接地とか、法律できちんと決められている。
よく、洗濯機とかを買うと、電源ケーブルと一緒に緑色の線が出てる。その緑の線を、 水道管とかの地中に接する金属管に接続してアースするんだ。これは、中の配線が破れて、 ケーブルが洗濯機に接触したりすると、感電の危険があるから、そういう場合は、アースに 逃がしましょってやつだ。こういうのを保安アースと言う。
電子回路の場合は、回路の電圧を大地と同じにして、安定させましょって目的に使われる。 また、(アマチュア)無線業界では、アンテナの一端をアースに接続して、大地をアンテナの一部に利用する形式の ものがある。そういうアンテナの場合は、アースがきちんとしてないと、電波の飛びが 悪くなったり、不要な電波を拾ってしまう事があるので、非常に大事なものになる。
アース棒を打ち込んで、きちんとアースが取れないような場合、電線を放射状に何本も 拡げて、大地との容量結合で臨時アースとする事が有る。無線だと、高周波の電波を 扱うので、こういうのでも、十分に役にたつ。俗称でこの主のアースをカウンターポーズと言う。
最近は、アナログとデジタルが同居してる電子回路が主流だ。その良い例が、携帯とか スマホ。電波を扱うアナログ部分やオーディオ部分と、それらをコントロールするコンピュータ群。
こういう回路は、アースと言っても、アナログ系のアースとデジタル系のアースを 分離するのが当たり前。そうしないと、デジタル回路が出すノイズがアナログ系に 回り込んで、非常に大きな問題になる。ああ、随分と余計な事を書いちゃったな。
nodeって宣言の中にshape = recordってのが有る。これは、部品を表す箱を幾つかに 分割しますよって意味だ。
次の行からは、部品の宣言が始まる。電源とかコンデンサとか、端子が2つ有るものは、 左右の箱が接続端子、真ん中の箱に部品番号とその値を括弧で括って表示するように 指示。三角括弧の中は端子の区別に使われる。そこに配線が行われる。
電子業界では、部品の接続は普通は半田付けで済ませる。けど、半田付けに不慣れな 人向けに、線材を巻き付ける配線方法も使われる事がある。ラッピングてやつね。 ラッパーと言う専用機械を使って、ラッピング用のピン(ラッピングポストと言う)に 線を巻き付けるんだ。丁度、この三角括弧は、ラッピングポストを生成してる事になるな。
トランジスタは、端子がコレクタ、ベース、エミッターと3端子の部品。だから、もう一つの 区分けを設けて、そこに部品番号と型名を入れている。
一番左側に有るのは、dot言語で内部的に使われるノード名になる。こうして、部品の 定義が終ると、次は配線になる。
配線箇所の指示は、ノード名:端子番号で表す。配線の始点と終点を、マイナス記号2本分 (これが、線材を意味する)を挟んで並べて行く。
電子回路を、文字の羅列に変換して、これをdotコマンドに渡すと、部品を適当に配置して、 その間を線で結んでくれる。回路図と言うか実体配線図が出来上がる訳だ。
TODO
えぃとばかりやった実証実験なので、色々と不満がある。
配線が一種類しかないので、醜い。これは、配線の指示をする時、赤の太い線を 使ってねとかすれば良いな。ブレッドボードは、上下の穴が横に繋がっていて、 あたかも電源のバスラインにしなさいってのを暗に指示してる。 それと同様で、赤太線は、プラスの電源ラインですとか、黒はグランドですとか、 見栄えがよくなるぞ。
部品を表す箱の形を工夫せい。ただし、レコード型は、角が丸いものしか バリエーションが無いので、どうするって問題になる。 これは、線材の色で端子を区別できれば、無理に箱を区切る必要がなくなる。 そうすれば、色々な形で部品の種別を表せる。
例えば、電源はltspiceのそれに倣って、丸印にするか。大事なんで、二重丸が良いか。 色も変えられるので、信号源として使う電源は、黄色とか。 コンデンサは、電解コンデンサもセラコンも昔から丸かったな。抵抗は、長い箱で いいか、ってな具合。デザインセンスが問われるぞ。
こういう事を考えると、2端子部品とか3端子部品って言う区分けから飛躍 しなければならない。部品の接頭語(RとかCとかQとか)で、処理の分岐が 必要になる。
こうなると、部品相当以外は、自然と無視される事になるんで、ネットリストを そのまま使えるようになるな。
後、画像ファイルは何も考えずにpngを指定しちゃったけど、svg形式の方が、 拡大/縮小に強いんで、こちらを使うべき。
最後にして、一番大きな問題。部品の配置がどうにか出来ないか。今のグラフは、 方向性が無いから、適当に配置されちゃうんだろうな。信号の流れ(方向性)を 加味すれば、有向グラフになるんだけど、そうなれば、少しは部品の配置を コントロール出来るようになるかな。もし、そうだとしても、どうやって方向性 を持ち込むか? それが問題だ。
gpicview
冒頭で書いたラズパイ本を読み進めていたら、最後の方にカメラモジュールを取り付けて、 タイムラプス写真を取りましょうなんてのが出てきた。
一定時間間隔で写真を撮って、後でそれを合成してビデオにしちゃうやつね。たまに TVで紹介されてて、さぞかし高等なテクニックがいるかと思ったら、簡単な事なのね。
この本の対象読者は、小学年の後半から中学生ぐらいかと思うんだけど、こういうのを 身に付けられちゃうとおじさんの立場な無いな。
それはさておき、カメラで試写をした時のJPGを表示するのにgpicviewって言う画像の ビューアーが紹介されてた。軽くてコマンドラインからも起動出来るそうな。
これって、firefoxでpngを表示させるよりは、よっぽど軽いのではなかろうか。 入れてみるか。
The following NEW packages will be installed: gpicview libauthen-sasl-perl libencode-locale-perl libfile-basedir-perl libfile-desktopentry-perl libfile-listing-perl libfile-mimeinfo-perl libfont-afm-perl libhtml-form-perl libhtml-format-perl libhtml-parser-perl libhtml-tagset-perl libhtml-tree-perl libhttp-cookies-perl libhttp-daemon-perl libhttp-date-perl libhttp-message-perl libhttp-negotiate-perl libio-html-perl libio-socket-ssl-perl libipc-system-simple-perl liblwp-mediatypes-perl liblwp-protocol-https-perl libmailtools-perl libnet-dbus-perl libnet-http-perl libnet-smtp-ssl-perl libnet-ssleay-perl libtie-ixhash-perl libtimedate-perl liburi-perl libwww-perl libwww-robotrules-perl libx11-protocol-perl libxml-parser-perl libxml-twig-perl libxml-xpathengine-perl xdg-utils 0 upgraded, 38 newly installed, 0 to remove and 0 not upgraded. Need to get 2,448 kB of archives. After this operation, 8,698 kB of additional disk space will be used.
何だかperlが一杯で、躊躇してますな。たかが画像を表示するのに、関係なさそうな パアルの関係者が必要なんか?
それはね、こんなたとえが分かり易いよ。gpicviewってお姫様を迎え入れる事になりました。 お姫様にはバアヤが必要で一緒に輿入れしてきました。ここまではいいけど、そのバアヤの 関係者もごっそりとくっついてきました。関係者はパアル一族。バアヤに相当するのは、 多分、xdg-utilsあたりだろうね。
そんな戯言より、svg表示出来るか?
GPicView - A Simple and Fast Image Viewer for X を見たけど、サポートしてる画像形式の説明は無し。ならば、眼を閉じて入れてみろ。
ちゃんとsvgもサポートしてたし、軽めでいいわー。
source for dot file
#!/usr/bin/python3 # make dot-file for a.cir infile = 'z.cir' def sadd(v, k): if k in wl: wl[k].append(v) else: wl[k] = [v] def node2(a): s = ' ' + a[0] s += (' [label = "<' + a[1] + '>' + a[1] + '|' ) s += (a[0] + '(' + a[3] + ')|<' ) s += (a[2] + '>' + a[2] + '"];' ) sadd( a[0] , a[1]) sadd( a[0] , a[2]) return s def node3(a): s = ' ' + a[0] s += (' [label = "{' + a[0] + '(' + a[4] + ')|{' ) s += ('<' + a[1] + '>' + a[1] + '|' ) s += ('<' + a[2] + '>' + a[2] + '|' ) s += ('<' + a[3] + '>' + a[3] + '}}"];' ) sadd(a[0] , a[1]) sadd(a[0] , a[2]) sadd(a[0] , a[3]) return s def wire(): for k in wl.keys(): for i,v in enumerate(wl[k]): if i == 0: bv = v else: print(' ', bv, ':', k, ' -- ', v, ':', k, ';') bv = v if k == '0': print(' ', bv, ':', k, ' -- gnd ;') print('graph basic {\n graph [size = "14, 12"];') print(' gnd [shape = invtriangle, label = "ground"];') print(' node [shape = record ];') wl = {} # wireing list w['sig'] = [q1,r3,c1 ...] for l in open(infile, 'r'): a = l.split() if len(a) == 4: print( node2(a) ) elif len(a) == 5: print( node3(a) ) else: print("Err: ", l) wire() print('}')
一応、プログラムの説明。メインが何処から始まっているかは、察してください。 何時もオイラーは、こういうスタイル。
wlってのは、ワイアリングリスト、辞書です。キーに信号名、値は部品名が入った配列。 信号が伝わる線材を、備品間に渡せて(配線)いくイメージです。
次からは、入力ファイルを開いて、一行ずつ処理していきます。取り込んだ一行を、 スペースを頼りに分割し配列に入れる。配列のサイズで、2端子部品か3端子部品、その他と 分類。必要な関数呼ぶか、あるいはエラー表示。
必要な関数では、部品情報の組み立てと配線リストの更新を行っている。(詳細後述) それが終ったら、配線情報を書き出して(wire関数の中で行っていて、我ながら一貫性が 無いな)から、dot語の締めを表示して終了。
必要な関数には、行を分割して情報が引数となる。例えば、node2は2端子部品の処理。 関数の返却文字列sに、必要なものを追加して行く。それが終了したら、ワイアリング リストの更新。最初はキーが登録されていない事も有るので、下請け関数に任せて いる。
下請け関数saddは、キーの信号名と、値の部品名が渡ってくる。辞書wlにキーが登録 されているかを、k in wl で調べて分岐。キーが有れば、値の配列の最後に追加。 無ければ、値が一つだけ入った配列を作成して、キーと結び付けている。(この操作で、 キーが登録される)
配線作業は、配線リストから、信号名を取り出し、値の配列をスキャンしながら、 配線に相当するdot語を出力してる。配列の最初だけは、配線先が無いので、区別してる。 そして、配線名が'0'だった場合は、spiceのグランドを意味するので、グランドの部品を 接続してる。
配線はループさせない。これ電子業界の掟。もしこれを破ると災難が降りかかります。 曰く、雑音と言う曰くありげな信号が混入してくるんだ。なんたって、これ幸いとばかりに、 電流がループ内をかけ巡りますからね。ループと言えば、IT屋さんも要注意。Hubのポートを 絶対にループ接続しない事。パケット溢れ攻撃が始まって、通信不能になるぞ。 (貧乏人が使う、安いHubだと発生します)
まあ、こんな調子で、ちと恥ずかしい叩き台が出来上がりました。
後は、TODOを消化すべく、Makefileに
hand: dot -Tsvg z.dot -o z.svg gpicview z.svg
こんなのを追加して、z.dotを手動変更し、出来栄えを確認してます。
etc
冒頭のムック本を自腹で買うとしたら、幾ら? 安倍ちゃんの威光があるうちは (得意の、面倒な事先送り戦術だけど)税率8%らしいので、少々ほっとしながら、
[sakae@fedora ~]$ gosh gosh> (* 1111 1.08) 1199.88 gosh> (/ 1200 1.08) 1111.111111111111 gosh> (/ 120000 108) 10000/9
割る数、割られる数をそれぞれ100倍して、整数領域に持ち込むと、有理数が出現したぞ。 (おまけに、約分もしてくれている)scheme素敵。
と、仮想世界で遊んでしまってはいけません。 こういう端数が出た場合、税法上どう扱うの? 切捨て、四捨五入? 素人的には、1200円かなあ。 逆算して、定価を出してみる。うんと正確にね。
[sakae@fedora ~]$ bc bc 1.06.95 scale = 50 1200 / 1.08 1111.11111111111111111111111111111111111111111111111111
無限精度計算機bcで少数点以下50桁まで求めてみた。 綺麗に1が並びましたね。循環小数で何処までも1が続くって事で良いかな。 これはもう、狙って定価を決めたに違いない。隠された秘密、なんちゃってね。
無限精度って言えばlisp/schemeだけれど、隠れlispであるPythonはどうよ。最近、 Pythonからはじめる数学入門 なんて本も出てるようだけど。
In [1]: 1200 / 1.08 Out[1]: 1111.111111111111
普通にやると、ここまでの精度か。それはさておき、この本の定価も意味深。
In [2]: 3024 * 1.08 Out[2]: 3265.92 In [3]: 3266 / 1.08 Out[3]: 3024.074074074074
これも凝った定価の設定? それとも、みんなこうなるの? 調べてミレ。
x = 3266 print x, " ", x--/1.08, "\n" 3266 3024.07407407407407407407407407407407407407407407407407 print x, " ", x--/1.08, "\n" 3265 3023.14814814814814814814814814814814814814814814814814 print x, " ", x--/1.08, "\n" 3264 3022.22222222222222222222222222222222222222222222222222 print x, " ", x--/1.08, "\n" 3263 3021.29629629629629629629629629629629629629629629629629 print x, " ", x--/1.08, "\n" 3262 3020.37037037037037037037037037037037037037037037037037 print x, " ", x--/1.08, "\n" 3261 3019.44444444444444444444444444444444444444444444444444 print x, " ", x--/1.08, "\n" 3260 3018.51851851851851851851851851851851851851851851851851 print x, " ", x--/1.08, "\n" 3259 3017.59259259259259259259259259259259259259259259259259 print x, " ", x--/1.08, "\n" 3258 3016.66666666666666666666666666666666666666666666666666
不思議な答えは、素数夜話のgaucheを使った素数論にも載ってるかなあ? たまには、開いてみよう。