「利用者:Kirari1192」の版間の差分
>Kirari1192 (途中だがセクションを作るため保存) |
>Kirari1192 |
||
390行目: | 390行目: | ||
日本語のウェブサイトでも今はUTF-8が主流ナリが過去にはShift-JISやEUC-JPが主流だった時代もあり、エンコーディングというのは現代では非常に重要な概念になっているのは間違いないですを | 日本語のウェブサイトでも今はUTF-8が主流ナリが過去にはShift-JISやEUC-JPが主流だった時代もあり、エンコーディングというのは現代では非常に重要な概念になっているのは間違いないですを | ||
=== 2022/11/6 | === 2022/11/6 浮動小数点数と浮動小数点演算 === | ||
コンピュータでの小数の取り扱いはそう簡単な話ではないナリ | コンピュータでの小数の取り扱いはそう簡単な話ではないナリ<br> | ||
例えば0.1という数を考えるナリ<br> | |||
5倍すれば0.1×5で0.5<ref>念の為に書いておきますが、何のとんちや引っ掛けもありません。単純な算数の話です</ref>、それは分かるよね? | |||
でもコンピュータの世界ではそうは行かないナリ | |||
(Kotlin) | |||
>>> 0.1f.toDouble() | |||
res12: kotlin.Double = 0.10000000149011612 | |||
>>> 0.1f.toDouble()*5 | |||
res13: kotlin.Double = 0.50000000745058060 | |||
コンピュータ上での0.1の扱いが強調されるように少し加工しているナリが<ref>KotlinなのかJavaのせいか不明だが、そのままやるとちゃんと0.5が出てくるので32ビット浮動小数点数(単精度)を64ビット(倍精度)に変換した</ref>、浮動小数点の世界では0.1を含む様々な小数点以下の値を厳密に保管できないですを | |||
これは浮動小数点の内部的な表現と2進数と10進数の変換に起因しているナリ<br> | |||
コンピュータに載っているCPUは{{wpl|ja:IEEE 754|IEEE 754}}形式に従って小数を表現していますを<br> | |||
細かいことに関してはMuyopediaのリンク先を見て欲しいナリが、大まかには符号部、指数部、仮数部の3つで成り立っていますを<br> | |||
0.1は2進数表現をすると循環節<ref>ある周期で永遠に繰り返すこと</ref>が発生するナリ そのため一定の桁数で表せないことから上で示したように誤差が発生しますを | |||
これが倍精度(64ビット)IEEE 754表現での0.1ですを | |||
(Kotlin) | |||
>>> 0.1.toRawBits().toString(2).padStart(64, '0') | |||
res22: kotlin.String = 0011111110111001100110011001100110011001100110011001100110011010 | |||
この数の仮数部は<code>1001100110011001100110011001100110011001100110011010</code>ナリ<br> | |||
ほぼ最後まで1001の繰り返しになっていることが分かると思うナリ これはいけない | |||
同様の理由で、大きな整数も浮動小数点数で表現できないですを<br> | |||
1234567890430440987654321という数を例に取るナリ<br> | |||
上が倍精度浮動小数点数、下が本来の2進数表現とそのビット数ナリ | |||
(Kotlin) | |||
>>> "1234567890430440987654321".toDouble().toRawBits().toString(2).padStart(64, '0') | |||
res45: kotlin.String = 0100010011110000010101101110000011110011011110111101011101111001 | |||
>>> "1234567890430440987654321".toBigInteger().toString(2) | |||
res47: kotlin.String = 100000101011011100000111100110111101111010111011110010001111111110111100010110001 | |||
>>> "1234567890430440987654321".toBigInteger().toString(2).length | |||
res48: kotlin.Int = 81 | |||
倍精度浮動小数点数の仮数部は52ビットなので、その仮数ビットに収まりきらない程の桁を入れようとしていたことが分かるナリ<br> | |||
これを<strong>桁落ち</strong>と言いますを 桁落ちは誤差の原因になるナリ | |||
同じ現象を引き起こす例として、大きな数と非常に小さい小数を足す場合があるナリ | |||
(Kotlin) | |||
>>> 43044.toDouble()+0.000000000005 | |||
res4: kotlin.Double = 43044.00000000001 | |||
浮動小数点数は整数部と小数部を自由自在に融通できて便利という面がある一方、小数点では循環節が発生して表現しきれないことがあるなど一長一短ナリ<br> | |||
通常の使い方では倍精度浮動小数点数で十分ナリが、言語によっては任意精度演算も可能なので必要に応じて使い分けることを切に望む。 | |||
==== プログラミング講座について ==== | |||
恒心教リッピング路線の原状復帰の目途が立ったので今回で終了ナリ 皆様との出会いに感謝<br> | |||
質問はいつでも受付けているナリ ではさよなら法政二中 またどこかでお会いしましょう | |||
== 脚注 == | == 脚注 == | ||
<references /> | <references /> |
2022年11月6日 (日) 19:09時点における版
恒心教 Kirari1192 | |
基本資料 | |
本名 | Keita Kameshima, Masaki Wada, Yuuichi Morizono, Taiyo Matsumura[1] |
---|---|
別名・渾名 | KoushinRip, SteadinessLows[2], Kirari1192, Kirari1185[3] |
一人称 | 当職 |
才能 | 無能 |
騒動との関連 | 恒心教徒 |
所属 | 恒心教 |
好きなもの | 神聖六文字 |
嫌いなもの | 唐澤貴洋・kusattapan、和田真樹など子共連合メンバー |
関係者 | |
|
旧垢のパスワード忘れたので唐澤貴洋殺す
この投稿者は恒心教信者です |
この投稿者はTorを使用しています |
ファイル:TRAIN.svg | この投稿者は恒心教リッピング路線にて活躍しています |
うぃっきの編集方針
デリュケーの恒心文庫を中心にやるナリ
魚拓は原則archive.isを使うナリがどうしようもない時は流石にarchive.orgで代用することもありますを
デリュケー転載の際のタイトルの付け方について
本文か後のレスなどからの特に名前の決め手が無ければインキピット方式(先頭数語を取ること)で付けることにしていまふ
恒心教リッピング路線
アニメなどのBDを丸ごとぶっこ抜いてtorrentに載せる路線。目的としては割れtorrentサイトを通した海外布教。
ぶっこ抜くにはMakeMKVがおすすめ。Linuxでも使える。 ドライブは自分語りになるので秘密。AACS対応のブツじゃないと流石に無理なので注意。
DVDはDVD Decrypter、CDはExact Audio Copyを使用。
当職のプロフはここ。(Tor芋用ミラー) なお寄付アドレスに入ったBTCは一部Wikiなどにも寄付しますを
Amazonリフレクション攻撃
Amazonの返品センターに返品手続きせずに物を発送すると返品センターは一度受領した上で返送してくる。 RTTは1~3週間と幅広いが攻撃対象へ物を押し付けるのに使える。なおAmazonのヘルプには裁量によって破棄することもあると記載されている模様。
この手法はDiscord路線教徒が長谷川亮太名義で発送した際に呼び止められて発覚。当該教徒はクロネコヤマトとのことだが、発送するだけなら理論上は日本郵便のゆうパックや佐川急便でも可能なはずである。
なお着払いしても必ず受領する模様。品名は適当で良い。カラコロはまずいだろうが。
送り状の作成はクロネコメンバーズ辺りでやると楽。他のサービスだと着払い伝票が出ないが、クロネコだけは着払いが出せる。手書きはやめたほうが良い。一番上が送り主控えのため指紋は問題ないが筆跡が残る上に何より面倒くさい。
逆引きをカスタマイズする方法
例えば、このように逆引きを明らかに変なものに変更してfusianasanしている教徒がいる。この手法について解説する。
とは言っても難しいものではなく、逆引きを変更できるVPSを契約すれば良い。 2度のクレームを跳ね除けた恒心の英雄たるPrivexで出来るかは分からないが、少なくともVultrやBuyVMでは可能である。 両者ともドメインの所有は問わないため、このような事が可能である。 なおLinodeはドメインの確認がある模様
一般的な串ではできないので注意。 また、言うまでもなく正引きはこの方法では変更されないため、(犯罪予告などで)ログにホスト名とIPアドレスの両方が残るような場合は無意味と化すので注意。止めはしないので頑張れ
2022/9/18に報告したちばけんまについて
詳細は「長谷川幸恵#2022年9月18日」を参照。
9/18に報告したちばけんまについてカラケーでは書ききれなかったものの身内には開示した内容をまとめます。更なる詳細は特定対策のため追って開示します。最上級教徒様の二の舞はよろしくない
- わざと追い付かせた時すれ違いざまに「何逃げてんの」だか「何で逃げるんだよ」だとか言われた気がする
- マンコーが本当は何を言ったのかは不詳。ちばけんまして聞いてみてくれ
- 多分越後屋のエプロン着て接客している男がマンコー
- ちばけんまの数ヶ月前に開示丼を食しました。おいしかったです
- 本当は8/10に行く予定だった
- 交通費を工面できなかったから
- 実は顔を隠す用にお面を持っていった
- 使用機会、無し!w
- ガイ・フォークス・マスクというアノニマスで有名なアレ
メモ欄
archiveiya74codqgiixo33q62qlrqtkgmcitqx5u2oeqnmn5bpcbiyd.onion
twitter3e4tixl4xyajtrzo62zg5vztmjuricljdp2c5kshju4avyoid.onion
利用者:Kirari1192/Koushinism_for_Beginners
恒心教リッピング路線 プログラミング講座
当職らの集団の使っていたAmazonアカウントが姪になったので新しいクレカが届くまでの間暇だからという理由でここで駄文を並べるナリ
なぜこんなことをやるのかというと恒心教リッピング路線であることを伏せて必要に応じてOSS貢献もしているからですを
なおこれは不定期の模様
プログラミングの基本をある程度把握していることを前提とするナリ
難しくはならないように頑張りますを
OSS担当が扱える言語の関係上言語はPythonとKotlinになりますを
バリュケーを含めここ以外では書いていないので注意して欲しいナリ
ここ以外で見かけたらそれは荒らしナリよ 処遇については各管理人で決めてほしいですを
唐澤貴洋Wikiとの出会いに感謝
2022/10/30 一文字ごとに繰り返す
唐澤貴洋殺すは恒心教徒なら誰でも知っているだろうと思うナリ その日何か悪いことが起これば唐澤貴洋に怒りをぶつけることで皆が皆に優しい世界を祈る、これはいい。
さて、普通であれば神聖六文字を複数回唱える時は単純に「唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す...」とするナリが、ここでは少し捻って「唐唐唐唐唐澤澤澤澤澤貴貴貴貴貴洋洋洋洋洋殺殺殺殺殺すすすすす」のように一文字づつ繰り返すことを考えてみるナリ
とは言え単純にこうしても最初に示したような繰り返しになるナリ
(Python) >>> '唐澤貴洋殺す'*5 '唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す' (Kotlin) >>> "唐澤貴洋殺す".repeat(5) res2: kotlin.String = 唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す
そこで、今何しようとしているのかを噛み砕いて考えてみるナリよ
- 文字列を文字ごとに分解したい (唐, 澤, 貴, 洋, 殺, す)
- 分解した文字を繰り返す (唐唐, 澤澤, 貴貴, 洋洋, 殺殺, すす)
- 結合する (唐唐澤澤貴貴洋洋殺殺すす)
この過程は非常に重要ですを
これによって何をどうするかという検討ができるナリ
初めに「文字列を文字ごとに分解したい」という点について考えてみるナリ
これについては、ここで扱う言語では文字列は「イテレーター」として扱われており難しいことを考える必要はないですを
「イテレーター」について解説
配列や文字列のような何かの並びを表すオブジェクトにおいて、その並びを最初から最後まで一個づつ取り出していく(反復する)概念/オブジェクトのことを指しますを
取り出される各項目は要素と言われるナリ
これで何が出来るかと言うと例えば数列の合計を計算したりある一定の条件に合う項目を流れ作業で数えることも出来るナリ
これによって1文字ごとに取り出すことができるので、各要素を繰り返しにすれば「分解した文字を繰り返す」ことが出来るナリ
以下の例では5回繰り返す場合を示しますを
(Python) >>> [x*5 for x in '唐澤貴洋殺す'] ['唐唐唐唐唐', '澤澤澤澤澤', '貴貴貴貴貴', '洋洋洋洋洋', '殺殺殺殺殺', 'すすすすす'] (Kotlin) >>> "唐澤貴洋殺す".map({a->a.toString().repeat(5)}) res5: kotlin.collections.List<kotlin.String> = [唐唐唐唐唐, 澤澤澤澤澤, 貴貴貴貴貴, 洋洋洋洋洋, 殺殺殺殺殺, すすすすす]
Pythonでは文字列から一文字取り出しても「長さ一文字の文字列」という扱いなのに対し、KotlinやJavaでは「文字」(Char)型に変わるナリ
このため、Kotlinでは「長さ一文字の文字列」に変換するために.toString()
を入れていますを
Pythonでは文字列に対して掛け算をすることでその数値の分だけ繰り返しさせることができますを
Kotlinでは文字列型にrepeat()
という関数があるのでこれを使う それはできるよね。
最後は各文字列が入った配列を結合するナリ
両方に結合する関数が存在するものの、呼び出しの主従関係が違うので気をつけるナリよ[4]
こういった結合系の関数では要素同士の間に何を入れるか指定できるナリが、ここでは空文字列にするナリ
(Python) >>> ''.join(x*5 for x in '唐澤貴洋殺す') '唐唐唐唐唐澤澤澤澤澤貴貴貴貴貴洋洋洋洋洋殺殺殺殺殺すすすすす' (Kotlin) >>> "唐澤貴洋殺す".map({a->a.toString().repeat(5)}).joinToString("") res6: kotlin.String = 唐唐唐唐唐澤澤澤澤澤貴貴貴貴貴洋洋洋洋洋殺殺殺殺殺すすすすす
こうして目的は達成できたナリよ 唐唐唐唐唐澤澤澤澤澤貴貴貴貴貴洋洋洋洋洋殺殺殺殺殺すすすすす
発展編: 縦書きカラコロ
要素同士の間に改行を入れるようにすると縦向きのカラコロを出力できるナリ
(Python) >>> print('\n'.join(x*5 for x in '唐澤貴洋殺す')) 唐唐唐唐唐 澤澤澤澤澤 貴貴貴貴貴 洋洋洋洋洋 殺殺殺殺殺 すすすすす (Kotlin) >>> "唐澤貴洋殺す".map({a->a.toString().repeat(5)}).joinToString("\n") res7: kotlin.String = 唐唐唐唐唐 澤澤澤澤澤 貴貴貴貴貴 洋洋洋洋洋 殺殺殺殺殺 すすすすす
これはいい。唐澤貴洋短冊にして殺す
2022/11/2 正規表現 初歩
貴職は何かのWikiのあるページから一定の条件に合う名前を探したいとするナリよ
例えば唐澤で始まって洋で終わるような名前ナリ[5]
そういう時は正規表現(regular expression)を使って検索出来るナリ
〇〇で始まって⚫⚫で終わるという指定の他繰り返し回数も指定できる、これはいい。
正規表現において、指定した表現に合致することをマッチする、と言いますを
以下、Pythonではimport re
があるものとしますを とりあえず取り急ぎ
リテラル
まずは正規表現の基本から始めますを リテラルは特殊ではない文字か(正しく)エスケープされている文字列を指しますを
Pythonではre.match
、KotlinではtoRegex().matches()
でマッチを試すことが出来るなりを またmatchの後を見ると何とマッチしたかが分かる、これはいい
(Python) >>> re.match(r'唐澤洋', '唐澤貴洋') >>> re.match(r'唐澤洋', '唐澤洋') <re.Match object; span=(0, 3), match='唐澤洋'> (Kotlin) >>> "唐澤洋".toRegex().matches("唐澤貴洋") res0: kotlin.Boolean = false >>> "唐澤洋".toRegex().matches("唐澤洋") res1: kotlin.Boolean = true
Pythonではre.Match object
が、Kotlinでは= true
と出ている方がマッチしている方ですを
これを見て分かる通り、唐澤貴洋の方にはマッチしていないことは明白。これはいけない
文字集合
????「唐澤貴洋にもマッチさせろナリ!」
ヤーマン「駄目です」
????「あブ」
とはならないのでだから安心だから安心だから安心
マッチさせる文字集合について考えるナリ
文字集合というのはマッチさせる(させない)文字の範囲のことですを
当然全ての文字にマッチというのも存在するナリ
例えば「貴」と「洋」だけとしたりとか、もしくは「裕」と「明」[6]以外にマッチさせるということができますを
「貴」と「洋」のように文字集合を指定するなら角括弧で囲んで[貴洋]
とすれば良いですを
AからZまで全部対象に入れたいのであればハイフンを使って[A-Z]
のように表現出来るナリ
当然[A-Z貴洋]
[7]のように合体させることも出来るナリよ なおA-Zは一体なので[A-貴Z洋]
のようにごちゃまぜにしては別の意味になってしまう。これはいけない[8]
これを踏まえて正規表現の途中に文字集合を入れるとこのようになるナリ
(Python) >>> re.match(r'唐澤[貴洋]洋', '唐澤貴洋') <re.Match object; span=(0, 4), match='唐澤貴洋'> >>> re.match(r'唐澤[貴洋]洋', '唐澤洋') (Kotlin) >>> "唐澤[貴洋]洋".toRegex().matches("唐澤貴洋") res0: kotlin.Boolean = true >>> "唐澤[貴洋]洋".toRegex().matches("唐澤洋") res1: kotlin.Boolean = false
全ての文字[9]にマッチさせたい時は.
一文字で出来るナリ
(Python) >>> re.match(r'唐澤.洋', '唐澤貴洋') <re.Match object; span=(0, 4), match='唐澤貴洋'> >>> re.match(r'唐澤.洋', '唐澤洋') (Kotlin) >>> "唐澤.洋".toRegex().matches("唐澤貴洋") res0: kotlin.Boolean = true >>> "唐澤.洋".toRegex().matches("唐澤洋") res1: kotlin.Boolean = false
しかし今度は唐澤洋にマッチしないナリ
量化指定子
????「次は両者にマッチするようにするナリ、当職はどれを使えば良いナリか」
*
- 0回以上無制限+
- 1回以上無制限?
- 0回以上1回以下{n}
- 丁度n回{n,}
- n回以上無制限{n,m}
- n回以上m回以下
????「あブ」(シンキングタイム: 哀れなデブを横目に何を使うか考えてみよう)
量化指定子は文字や文字集合などの後に付けるナリ またmやnは実際に正規表現に使う時は数値(例: {334,40298}
)に置き換える必要があるナリ
正解発表ナリ
最短という面では正解は?
ですを 「0回以上1回以下」は「存在してもしなくても良い」と考えて欲しいですを(以下Kotlin省略)
(Python) >>> re.match(r'唐澤.?洋', '唐澤貴洋') <re.Match object; span=(0, 4), match='唐澤貴洋'> >>> re.match(r'唐澤.?洋', '唐澤洋') <re.Match object; span=(0, 3), match='唐澤洋'> >>> re.match(r'唐澤.?洋', '唐澤死洋') <re.Match object; span=(0, 4), match='唐澤死洋'>
この場合、.に?の量化指定子を使用したので唐澤と洋の間にどんな文字でも入れられますを
どんな長さの文字列が入っても良いなら*
を使いますを
(Python) >>> re.match(r'唐澤.*洋', '唐澤貴洋ナイフで滅多刺しにして殺す。洋、お前もだ') <re.Match object; span=(0, 19), match='唐澤貴洋ナイフで滅多刺しにして殺す。洋'> >>> re.match(r'唐澤.*洋', '唐澤洋') <re.Match object; span=(0, 3), match='唐澤洋'> >>> re.match(r'唐澤.*洋', '唐澤死洋') <re.Match object; span=(0, 4), match='唐澤死洋'>
量化指定子を使いつつ最短でマッチさせたい場合は、量化指定子に続けて?
を付けるナリよ (唐澤貴洋のみにマッチすることに注目)
(Python) >>> re.match(r'唐澤.*?洋', '唐澤貴洋ナイフで滅多刺しにして殺す。洋、お前もだ') <re.Match object; span=(0, 4), match='唐澤貴洋'>
当然全ての量化指定子はリテラル(文字)にも使えますを
(Python) >>> re.match(r'唐澤貴?洋', '唐澤貴洋') <re.Match object; span=(0, 4), match='唐澤貴洋'> >>> re.match(r'唐澤貴?洋', '唐澤洋') <re.Match object; span=(0, 3), match='唐澤洋'> >>> re.match(r'唐澤貴*洋', '唐澤貴貴貴洋') <re.Match object; span=(0, 6), match='唐澤貴貴貴洋'>
まとめ
OSS部員が疲れたと言うのでここで終わりになってしまうナリが、正規表現の基礎中の基礎はなんとか理解できると思うナリ
分からないことがあれば議論ページで質問してくれればOSS部員に丸投げして答えるナリ
正規表現はもっと奥深い世界なので興味を持った芋はもっと調べてみることを切に望む[10]。
2022/11/4 文字列? バイト配列? エンコーディング?
文字化けはインターネットで日本語に限らずマルチバイト文字が関係する環境であれば誰でも見たことがあると思うナリ
"蜚先セ、雋エ豢区ョコ縺�" 文字化けだからセーフ
文字化けはなぜ起こるナリか? 理由は簡単で出力したときのエンコーディングと読み込むときのエンコーディングが違うからナリ
今回は文字列とバイト配列の違い、そしてエンコーディングがどう関わってくるかについて考えるナリ
今回はPythonだけとさせて頂くナリ とりあえず取り急ぎ
文字列
????「まずは『文字列』について考えるナリ。これは何ナリか」
文字列は一繋がりの文字の並びを指すナリ。例えば"唐澤貴洋Wiki"は文字列ですを
別の観点から見れば文字配列のようにも考えることができますを[11]
"文字"を数値と見ると、よくあるものは16ビット数値[12]として見なすナリ
これは文字コード[13]を直接記憶するためにその程度のビット数を確保する必要があるからですを
(Python) >>> ord('唐') 21776 >>> ord('澤') 28580 >>> ord('貴') 36020 >>> ord('洋') 27915 >>> ord('殺') 27578 >>> ord('す') 12377
バイト配列
バイト配列は一繋がりのバイトの並びを指すナリ バイト(byte)とは通常は8ビット数値[14]を指し、符号付き(signed)では-127~127、符号なし(unsigned)では0~255までの範囲を表せる数値型ナリ
Pythonでは文字列(str)とバイト配列(bytes/bytearray)が非常に似た型になっていて紛らわしいナリが本来は全くの別物ナリ
この表現はファイルに書き込んだり、外部と通信する時に使いますを
(Python) >>> b'I will kill Takahiro Karasawa' b'I will kill Takahiro Karasawa' >>> b'I will kill Takahiro Karasawa'.hex() '492077696c6c206b696c6c2054616b616869726f204b61726173617761'
1バイトを16進数にすると丁度2文字になるので色々と都合の良い表現と言えるのが特徴ナリね
エンコーディング
では文字列をファイルに書き出したい時はどうするかについて考えるナリ
文字そのものをファイルに書き出すとは言ってもバイト配列に変換しなければならないナリ
その文字列をバイト配列に変換する方式のことをエンコーディング(encoding)と言いますを
このエンコーディングが出力時と読み込み時で異なると文字化けするナリよ
(Python) >>> '唐澤貴洋殺す'.encode('euc-jp').decode('sjis') 'ナ籬キオョヘホサヲ、ケ'
一例として唐澤貴洋殺すを色々なエンコーディングで表現したらこのようになるナリ (bytesのままでは見づらいため16進数に変換)
(Python) >>> for enc in ('utf-8', 'utf-16', 'sjis', 'euc-jp'): ... print(f'{enc}: {"唐澤貴洋殺す".encode(enc).hex()}') ... utf-8: e59490e6bea4e8b2b4e6b48be6aebae38199 utf-16: fffe1055a46fb48c0b6dba6b5930 sjis: 9382e0568b4d976d8e4582b7 euc-jp: c5e2dfb7b5aecdcebba6a4b9
日本語のウェブサイトでも今はUTF-8が主流ナリが過去にはShift-JISやEUC-JPが主流だった時代もあり、エンコーディングというのは現代では非常に重要な概念になっているのは間違いないですを
2022/11/6 浮動小数点数と浮動小数点演算
コンピュータでの小数の取り扱いはそう簡単な話ではないナリ
例えば0.1という数を考えるナリ
5倍すれば0.1×5で0.5[15]、それは分かるよね?
でもコンピュータの世界ではそうは行かないナリ
(Kotlin) >>> 0.1f.toDouble() res12: kotlin.Double = 0.10000000149011612 >>> 0.1f.toDouble()*5 res13: kotlin.Double = 0.50000000745058060
コンピュータ上での0.1の扱いが強調されるように少し加工しているナリが[16]、浮動小数点の世界では0.1を含む様々な小数点以下の値を厳密に保管できないですを
これは浮動小数点の内部的な表現と2進数と10進数の変換に起因しているナリ
コンピュータに載っているCPUはIEEE 754形式に従って小数を表現していますを
細かいことに関してはMuyopediaのリンク先を見て欲しいナリが、大まかには符号部、指数部、仮数部の3つで成り立っていますを
0.1は2進数表現をすると循環節[17]が発生するナリ そのため一定の桁数で表せないことから上で示したように誤差が発生しますを
これが倍精度(64ビット)IEEE 754表現での0.1ですを
(Kotlin) >>> 0.1.toRawBits().toString(2).padStart(64, '0') res22: kotlin.String = 0011111110111001100110011001100110011001100110011001100110011010
この数の仮数部は1001100110011001100110011001100110011001100110011010
ナリ
ほぼ最後まで1001の繰り返しになっていることが分かると思うナリ これはいけない
同様の理由で、大きな整数も浮動小数点数で表現できないですを
1234567890430440987654321という数を例に取るナリ
上が倍精度浮動小数点数、下が本来の2進数表現とそのビット数ナリ
(Kotlin) >>> "1234567890430440987654321".toDouble().toRawBits().toString(2).padStart(64, '0') res45: kotlin.String = 0100010011110000010101101110000011110011011110111101011101111001 >>> "1234567890430440987654321".toBigInteger().toString(2) res47: kotlin.String = 100000101011011100000111100110111101111010111011110010001111111110111100010110001 >>> "1234567890430440987654321".toBigInteger().toString(2).length res48: kotlin.Int = 81
倍精度浮動小数点数の仮数部は52ビットなので、その仮数ビットに収まりきらない程の桁を入れようとしていたことが分かるナリ
これを桁落ちと言いますを 桁落ちは誤差の原因になるナリ
同じ現象を引き起こす例として、大きな数と非常に小さい小数を足す場合があるナリ
(Kotlin) >>> 43044.toDouble()+0.000000000005 res4: kotlin.Double = 43044.00000000001
浮動小数点数は整数部と小数部を自由自在に融通できて便利という面がある一方、小数点では循環節が発生して表現しきれないことがあるなど一長一短ナリ
通常の使い方では倍精度浮動小数点数で十分ナリが、言語によっては任意精度演算も可能なので必要に応じて使い分けることを切に望む。
プログラミング講座について
恒心教リッピング路線の原状復帰の目途が立ったので今回で終了ナリ 皆様との出会いに感謝
質問はいつでも受付けているナリ ではさよなら法政二中 またどこかでお会いしましょう
脚注
- ↑ KoushinRipのリクエスト送付先の名義
- ↑ グループ名として。ただしSteadinessLowsは会員制トラッカーで使用している
- ↑ 割れtorrentサイトなどで主に使用
- ↑ OSS担当より: Pythonの呼び出し方は少数派らしい。Kotlinのように配列やリストに対して呼び出して文字列を指定する書き方のほうが多数派とか
- ↑ 現在MediaWikiには正規表現検索機能は無いので対象として使いやすい名前からとしました。貴洋なんて名前を付けた厚子が悪い
- ↑ 淫乱乳首はお呼びでないので答えだけ書きます。
[^裕明]
とすればできます。^
は指定した文字集合を反転するという意味になります。誰とは言わんが早く解放しろ乳首 - ↑ この例ではAからZまたは貴洋から一文字の合計一文字だが、
[A-Z][貴洋]
とすると、AからZまでの一文字と貴洋のいずれか一文字の合計2文字にマッチする。集合一個が文字に相当するので注意 - ↑ ここでのハイフンはUnicodeコードポイント上での範囲を指すため、こうしてしまうとA(U+0041)から貴(U+8CB4)という相当広い範囲に加えてZ(U+005A)と洋(U+6D0B)という"A-貴"の範囲に入るためほぼ無意味な指定が続くという構図になる。これはいけない
- ↑ (ここでは扱わない)フラグによるが、改行文字も含む
- ↑ 取材注: なお当の部員はHTMLの正規表現とHTMLの2つとにらめっこして頭の中でマッチとか修正したり、HTMLやその他コードを見て正しく切り出せるであろう正規表現で一発で書けるらしい。バケモンか?
- ↑ Cでは正にそのようになる。また他の言語でも内部的には文字型の配列を持っていることが珍しくなく、Java 9以前のJavaはその一例と言える
- ↑ Goのように文字型が32ビットになる言語も存在する。
- ↑ 大体Unicodeである
- ↑ 通常は、と書いたのは7ビットや9ビットの環境もあるという意味だが、これらは主にメインフレームなどで使われているものであるため考えない
- ↑ 念の為に書いておきますが、何のとんちや引っ掛けもありません。単純な算数の話です
- ↑ KotlinなのかJavaのせいか不明だが、そのままやるとちゃんと0.5が出てくるので32ビット浮動小数点数(単精度)を64ビット(倍精度)に変換した
- ↑ ある周期で永遠に繰り返すこと