Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
IEEE754を完全に理解した
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kaneko Takeshi
December 24, 2021
Programming
84
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
IEEE754を完全に理解した
PIZZA_JP#47
Kaneko Takeshi
December 24, 2021
More Decks by Kaneko Takeshi
See All by Kaneko Takeshi
オープンソースライセンスについて勉強する定期
tkckaneko
0
42
Eye Tracking on the Browser
tkckaneko
0
99
CSSのトレンドをみんなで見よう -2021年-
tkckaneko
0
100
多分これが一番早いと思います
tkckaneko
0
31
暗黒面の話
tkckaneko
0
30
CSR / SSR / SSG / JAMstack
tkckaneko
0
78
BOLT
tkckaneko
0
40
CSS Logical Properties and Values
tkckaneko
0
50
Visual Effect Graphをさわってみた
tkckaneko
0
38
Other Decks in Programming
See All in Programming
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
400
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
13
6.2k
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.5k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
260
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
370
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
130
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
300
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
7.7k
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
920
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
130
Agentic UI
manfredsteyer
PRO
0
190
Featured
See All Featured
Faster Mobile Websites
deanohume
310
32k
Practical Orchestrator
shlominoach
191
11k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.4k
Being A Developer After 40
akosma
91
590k
Transcript
IEEE 754を完全に理解した
JavaScriptの小数計算 消費税の計算をしようとする 価格:100円 消費税:8% 108円ですよね?
JavaScriptの小数計算 消費税の計算をしようとするけど、消費税が上がりました 価格:100円 消費税:10% 110.00000000000001円???
JavaScriptの数値:Number型 JavaScript の Number 型は IEEE 754 の倍精度 64ビットバイナリ形式であ り、
Java や C# の double のようなものです。これは小数点以下の数値を表 すことができることを意味しますが、格納できる値にはいくつかの制限があ ります。 Number は小数点以下約 17 桁の精度しか保持できません。演算 は丸め誤差の影響を受けます。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number
小数を扱うときに使うライブラリ こんなライブラリを使うのがデファクトスタンダードになっている - big.js - 超軽量 - bignumber.js - big.jsより多機能
- decimal.js - bignumber.jsと同じ機能 - 精度は小数点以下ではなく有効数字で指定
IEEE 754を勉強する 浮動小数点方式においては、固定長の仮数部と固定長の指数部の2つの 部分の組み合わせによって、数値を表現する。 符号(1 ビット) | 指数部(11 ビット) |
仮数部(52 ビット) https://ja.wikipedia.org/wiki/浮動小数点数
IEEE 754を勉強する 符号: 正の値なら 0、 負の値なら 1。 指数: 実際の値に 1023
を加えた値を使う。11 桁なので2048まで表現でき るけど、指数部が負の時があるから-1023~1024 を表現して 1023 を足す ようにしてる。 仮数: 指数を調整して 1.◯◯ のように 1.で始まるように小数点を移動す る。先頭の 1 は絶対なので無視する。 https://ja.wikipedia.org/wiki/浮動小数点数
IEEE 754を勉強する 例えば、2.5を浮動小数点数で表す 符号は正の値なので 0 仮数の絶対値は2.5で、2と0.5に分ける 2を2で割ると 2 / 2
→ 1 で余り 0 0.5を2でかけると 0.5 * 2 → 1.0 1以上なので1 2進数で表すと10.1となる https://ja.wikipedia.org/wiki/浮動小数点数
IEEE 754を勉強する 1.の部分は絶対なので無視 仮数部は1未満なので、右シフトして相殺分として2の指数を1とする (1 + 0.25)* 2 ^ 1
と変換される 仮数部は0.25、指数は1となる 指数部は指数にバイアス値1023を足すと1024になる https://ja.wikipedia.org/wiki/浮動小数点数
IEEE 754を勉強する 符号部(1ビット) :+ → 0 指数部(11ビット) :1024 → 100
0000 0000 仮数部(52ビット) :0.25 → 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ※ 残りを 52 ビットになるように 0 でうめる 浮動小数点は、最上位ビットから符号部、指数部、仮数部の順に表すため 0 100 0000 0000 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 https://ja.wikipedia.org/wiki/浮動小数点数
0.1で考えてみる 0.1 * 2 → 0.2 1未満なので0 0.2 * 2
→ 0.4 1未満なので0 0.4 * 2 → 0.8 1未満なので0 0.8 * 2 → 1.6 1以上なので1 0.6 * 2 → 1.2 1以上なので1 0.2 * 2 → 0.4 1未満なので0 0.4 * 2 → 0.8 1未満なので0 0.8 * 2 → 1.6 1以上なので1 0.6 * 2 → 1.2 1以上なので1 循環小数!
0.1で考えてみる 入りきらなくなるので値を丸める必要がある 最近接偶数丸め。0 は切り捨てて 1 は切り上げる 0011 1101 1100 1100
1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1 1 なので切り上げ 丸め誤差!
- ちゃんと計算してみると楽しい まとめ