1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
#import "@preview/touying:0.6.1": *
#import "setoka.typ": *
#show: setoka-theme.with(
aspect-ratio: "16-9",
config-info(
title: [
浮動小数点数の半開区間で \
単一値を指定する
],
subtitle: [PHP 勉強会\@東京 第 180 回],
author: [nsfisis (いまむら)],
date: datetime(year: 2025, month: 10, day: 29),
),
)
#set text(font: "Noto Sans CJK JP")
#title-slide()
#about-slide()
数値の範囲を指定して検索する API
---
半開区間
[x, y)
x を含み、y を含まない
---
[3, 7)
3, 4, 5, 6
---
ちょうど 5
[5, 6)
---
ちょうど n
[n, n+1)
---
整数ならこれで OK
---
実数なら?
---
ちょうど 1
[1, 2)
1, 1.5, 1.7, 1.989
---
[1, 1より少しだけ大きい値)
間に 1 しか入らない範囲
---
[1, p)
間に 1 しか入らない範囲?
---
[1, p)
間に 1 しか入らない範囲?
(1+p)/2 が入る
---
無理 (実数では)
---
実数は無限精度ある
---
コンピュータ上の実数表現は
有限精度
---
[1, p)
---
[1, p)
コンピュータ上なら
都合のいい p が存在する
---
64 bit の浮動小数点数の場合
[1, p)
p = 1.0000000000000002
---
1 = 0011111111110000000000000000000000000000000000000000000000000000
p = 0011111111110000000000000000000000000000000000000000000000000001
---
浮動小数点数
IEEE 754
---
IEEE 754
nextUp
nextDown
---
IEEE 754
nextUp: 僅かに大きい値を返す
nextDown: 僅かに小さい値を返す
---
ちょうど x
[x, nextUp(x))
---
PHP には nextUp/nextDown が無い
---
無いので作りました
nsfisis/php-next-after
---
```php
use Nsfisis\NextAfter\NextAfter;
function toExactFloatRange($from) {
$to = NextAfter::nextUp($from);
return [$from, $to];
}
```
|