Introduction
The table below lists the focal length equivalents between formats, keeping track of aspect ratios, such that every format can fit into any target format. In other words the equivalent format is strictly wider.
Focal lens equivalents
APS-C
APS-C
Focal length
|
Horizontal FOV
|
Vertical FOV
|
APS-C
|
35mm
|
GFX
|
H5D
|
4x5
|
6x17
|
8x10
|
10mm
|
102.9
|
79.7
|
10
|
14
|
17
|
21
|
48
|
36
|
101
|
14mm
|
83.7
|
61.6
|
14
|
20
|
24
|
30
|
67
|
50
|
142
|
16mm
|
76.2
|
55.1
|
16
|
23
|
28
|
34
|
77
|
57
|
162
|
18mm
|
69.8
|
49.8
|
18
|
26
|
31
|
39
|
87
|
65
|
182
|
35mm
|
39.5
|
26.8
|
35
|
50
|
61
|
75
|
169
|
126
|
354
|
50mm
|
28.2
|
19.0
|
50
|
72
|
87
|
107
|
241
|
180
|
506
|
55mm
|
25.7
|
17.3
|
55
|
79
|
96
|
118
|
265
|
198
|
557
|
56mm
|
25.3
|
17.0
|
56
|
80
|
98
|
120
|
270
|
201
|
567
|
60mm
|
23.6
|
15.8
|
60
|
86
|
105
|
128
|
289
|
216
|
607
|
80mm
|
17.8
|
11.9
|
80
|
115
|
140
|
171
|
386
|
287
|
810
|
90mm
|
15.9
|
10.6
|
90
|
129
|
157
|
193
|
434
|
323
|
911
|
200mm
|
7.2
|
4.8
|
200
|
287
|
349
|
428
|
964
|
719
|
2024
|
35mm full frame
35mm full frame
Focal length
|
Horizontal FOV
|
Vertical FOV
|
APS-C
|
35mm
|
GFX
|
H5D
|
4x5
|
6x17
|
8x10
|
14mm
|
104.3
|
81.2
|
10
|
14
|
17
|
21
|
47
|
35
|
99
|
16mm
|
96.7
|
73.7
|
11
|
16
|
19
|
24
|
54
|
40
|
113
|
17mm
|
93.3
|
70.4
|
12
|
17
|
21
|
25
|
57
|
42
|
120
|
19mm
|
86.9
|
64.6
|
13
|
19
|
23
|
28
|
64
|
48
|
134
|
20mm
|
84.0
|
61.9
|
14
|
20
|
24
|
30
|
67
|
50
|
141
|
24mm
|
73.7
|
53.1
|
17
|
24
|
29
|
36
|
81
|
60
|
169
|
28mm
|
65.5
|
46.4
|
19
|
28
|
34
|
42
|
94
|
70
|
198
|
35mm
|
54.4
|
37.8
|
24
|
35
|
43
|
52
|
118
|
88
|
247
|
45mm
|
43.6
|
29.9
|
31
|
45
|
55
|
67
|
151
|
112
|
318
|
50mm
|
39.6
|
27.0
|
35
|
50
|
61
|
75
|
168
|
125
|
353
|
85mm
|
23.9
|
16.1
|
59
|
85
|
103
|
127
|
286
|
212
|
600
|
105mm
|
19.5
|
13.0
|
73
|
105
|
128
|
157
|
353
|
262
|
741
|
120mm
|
17.1
|
11.4
|
84
|
120
|
146
|
179
|
403
|
300
|
847
|
200mm
|
10.3
|
6.9
|
139
|
200
|
243
|
298
|
672
|
500
|
1411
|
Fuji GFX
Fuji GFX
Focal length
|
Horizontal FOV
|
Vertical FOV
|
APS-C
|
35mm
|
GFX
|
H5D
|
4x5
|
6x17
|
8x10
|
23mm
|
87.2
|
71.0
|
12
|
17
|
23
|
28
|
64
|
42
|
133
|
32mm
|
68.8
|
54.3
|
16
|
23
|
32
|
39
|
88
|
59
|
186
|
45mm
|
51.9
|
40.0
|
23
|
33
|
45
|
55
|
124
|
82
|
261
|
50mm
|
47.3
|
36.3
|
25
|
37
|
50
|
61
|
138
|
91
|
290
|
63mm
|
38.3
|
29.2
|
32
|
46
|
63
|
77
|
174
|
115
|
365
|
100mm
|
24.7
|
18.6
|
51
|
73
|
100
|
123
|
276
|
183
|
580
|
110mm
|
22.5
|
17.0
|
56
|
80
|
110
|
135
|
304
|
201
|
638
|
200mm
|
12.5
|
9.4
|
102
|
146
|
200
|
245
|
553
|
366
|
1160
|
250mm
|
10.0
|
7.5
|
127
|
183
|
250
|
306
|
691
|
457
|
1450
|
Hasselblad 24mm
|
84.8
|
68.7
|
12
|
18
|
24
|
29
|
66
|
44
|
139
|
Hasselblad 28mm
|
76.1
|
60.7
|
14
|
20
|
28
|
34
|
77
|
51
|
162
|
Hasselblad 35mm
|
64.1
|
50.2
|
18
|
26
|
35
|
43
|
97
|
64
|
203
|
Hasselblad 50mm
|
47.3
|
36.3
|
25
|
37
|
50
|
61
|
138
|
91
|
290
|
Hasselblad 80mm
|
30.6
|
23.2
|
41
|
59
|
80
|
98
|
221
|
146
|
464
|
Hasselblad 90mm
|
27.4
|
20.7
|
46
|
66
|
90
|
110
|
249
|
165
|
522
|
Hasselblad 110mm
|
22.5
|
17.0
|
56
|
80
|
110
|
135
|
304
|
201
|
638
|
Hasselblad 150mm
|
16.6
|
12.5
|
76
|
110
|
150
|
184
|
414
|
274
|
870
|
Hasselblad 210mm
|
11.9
|
8.9
|
107
|
154
|
210
|
257
|
580
|
384
|
1218
|
Hasselblad 300mm
|
8.4
|
6.3
|
153
|
220
|
300
|
368
|
829
|
549
|
1740
|
Hasselblad 24mm (1.5)
|
62.6
|
49.0
|
18
|
26
|
36
|
44
|
99
|
66
|
209
|
Hasselblad 28mm (1.5)
|
55.1
|
42.7
|
21
|
31
|
42
|
51
|
116
|
77
|
244
|
Hasselblad 35mm (1.5)
|
45.3
|
34.7
|
27
|
38
|
52
|
64
|
145
|
96
|
304
|
Hasselblad 50mm (1.5)
|
32.6
|
24.7
|
38
|
55
|
75
|
92
|
207
|
137
|
435
|
Hasselblad 80mm (1.5)
|
20.7
|
15.6
|
61
|
88
|
120
|
147
|
332
|
220
|
696
|
Hasselblad 90mm (1.5)
|
18.4
|
13.9
|
69
|
99
|
135
|
165
|
373
|
247
|
783
|
Hasselblad 110mm (1.5)
|
15.1
|
11.4
|
84
|
121
|
165
|
202
|
456
|
302
|
957
|
Hasselblad 150mm (1.5)
|
11.1
|
8.3
|
115
|
165
|
225
|
276
|
622
|
412
|
1305
|
Hasselblad 210mm (1.5)
|
8.0
|
6.0
|
160
|
230
|
315
|
386
|
870
|
576
|
1827
|
Hasselblad 300mm (1.5)
|
5.6
|
4.2
|
229
|
329
|
450
|
552
|
1243
|
823
|
2610
|
Pentax 645
Pentax 645
Focal length
|
Horizontal FOV
|
Vertical FOV
|
APS-C
|
35mm
|
GFX
|
H5D
|
4x5
|
6x17
|
8x10
|
25mm
|
82.4
|
66.5
|
13
|
18
|
25
|
31
|
69
|
46
|
145
|
28mm
|
76.1
|
60.7
|
14
|
20
|
28
|
34
|
77
|
51
|
162
|
33mm
|
67.1
|
52.9
|
17
|
24
|
33
|
40
|
91
|
60
|
191
|
45mm
|
51.9
|
40.0
|
23
|
33
|
45
|
55
|
124
|
82
|
261
|
55mm
|
43.4
|
33.2
|
28
|
40
|
55
|
67
|
152
|
101
|
319
|
80mm
|
30.6
|
23.2
|
41
|
59
|
80
|
98
|
221
|
146
|
464
|
85mm
|
28.9
|
21.8
|
43
|
62
|
85
|
104
|
235
|
155
|
493
|
110mm
|
22.5
|
17.0
|
56
|
80
|
110
|
135
|
304
|
201
|
638
|
150mm
|
16.6
|
12.5
|
76
|
110
|
150
|
184
|
414
|
274
|
870
|
160mm
|
15.6
|
11.7
|
81
|
117
|
160
|
196
|
442
|
293
|
928
|
300mm
|
8.4
|
6.3
|
153
|
220
|
300
|
368
|
829
|
549
|
1740
|
Hasselblad H5D-60
Hasselblad H5D-60
Focal length
|
Horizontal FOV
|
Vertical FOV
|
APS-C
|
35mm
|
GFX
|
H5D
|
4x5
|
6x17
|
8x10
|
24mm
|
96.4
|
79.9
|
10
|
14
|
20
|
24
|
54
|
36
|
114
|
28mm
|
87.6
|
71.3
|
12
|
17
|
23
|
28
|
63
|
42
|
132
|
35mm
|
75.0
|
59.7
|
15
|
21
|
29
|
35
|
79
|
52
|
166
|
50mm
|
56.5
|
43.8
|
21
|
30
|
41
|
50
|
113
|
75
|
236
|
80mm
|
37.1
|
28.2
|
33
|
48
|
65
|
80
|
180
|
119
|
378
|
90mm
|
33.2
|
25.2
|
37
|
54
|
73
|
90
|
203
|
134
|
426
|
110mm
|
27.4
|
20.7
|
46
|
66
|
90
|
110
|
248
|
164
|
520
|
150mm
|
20.3
|
15.3
|
62
|
90
|
122
|
150
|
338
|
224
|
709
|
210mm
|
14.6
|
10.9
|
87
|
125
|
171
|
210
|
473
|
313
|
993
|
300mm
|
10.2
|
7.7
|
125
|
179
|
245
|
300
|
676
|
448
|
1419
|
24mm (1.5)
|
73.4
|
58.4
|
15
|
21
|
29
|
36
|
81
|
54
|
170
|
28mm (1.5)
|
65.2
|
51.1
|
17
|
25
|
34
|
42
|
95
|
63
|
199
|
35mm (1.5)
|
54.2
|
41.9
|
22
|
31
|
43
|
52
|
118
|
78
|
248
|
50mm (1.5)
|
39.4
|
30.0
|
31
|
45
|
61
|
75
|
169
|
112
|
355
|
80mm (1.5)
|
25.2
|
19.0
|
50
|
72
|
98
|
120
|
270
|
179
|
568
|
90mm (1.5)
|
22.5
|
16.9
|
56
|
81
|
110
|
135
|
304
|
201
|
639
|
110mm (1.5)
|
18.5
|
13.9
|
69
|
99
|
135
|
165
|
372
|
246
|
780
|
150mm (1.5)
|
13.6
|
10.2
|
93
|
134
|
184
|
225
|
507
|
336
|
1064
|
210mm (1.5)
|
9.7
|
7.3
|
131
|
188
|
257
|
315
|
710
|
470
|
1490
|
300mm (1.5)
|
6.8
|
5.1
|
187
|
269
|
367
|
450
|
1014
|
672
|
2128
|
LF (4x5)
LF (4x5)
Focal length
|
Horizontal FOV
|
Vertical FOV
|
APS-C
|
35mm
|
GFX
|
H5D
|
4x5
|
6x17
|
8x10
|
72mm
|
80.1
|
67.9
|
12
|
18
|
24
|
30
|
72
|
45
|
151
|
90mm
|
67.8
|
56.6
|
15
|
22
|
30
|
37
|
90
|
56
|
188
|
150mm
|
43.9
|
35.8
|
26
|
37
|
51
|
62
|
150
|
93
|
314
|
240mm
|
28.3
|
22.8
|
41
|
59
|
81
|
99
|
240
|
148
|
502
|
300mm
|
22.8
|
18.4
|
52
|
74
|
101
|
124
|
300
|
186
|
628
|
LF (6x17)
LF (6x17)
Focal length
|
Horizontal FOV
|
Vertical FOV
|
APS-C
|
35mm
|
GFX
|
H5D
|
4x5
|
6x17
|
8x10
|
72mm
|
99.5
|
45.2
|
11
|
15
|
19
|
23
|
51
|
72
|
108
|
90mm
|
86.7
|
36.9
|
13
|
19
|
23
|
28
|
64
|
90
|
134
|
150mm
|
59.1
|
22.6
|
22
|
32
|
39
|
47
|
107
|
150
|
224
|
240mm
|
39.0
|
14.3
|
35
|
51
|
62
|
76
|
171
|
240
|
359
|
300mm
|
31.6
|
11.4
|
44
|
64
|
77
|
95
|
214
|
300
|
448
|
LF (8x10)
LF (8x10)
Focal length
|
Horizontal FOV
|
Vertical FOV
|
APS-C
|
35mm
|
GFX
|
H5D
|
4x5
|
6x17
|
8x10
|
150mm
|
80.5
|
68.2
|
12
|
18
|
24
|
30
|
71
|
44
|
150
|
240mm
|
55.8
|
45.8
|
20
|
28
|
39
|
48
|
114
|
71
|
240
|
300mm
|
45.9
|
37.4
|
25
|
35
|
48
|
59
|
143
|
89
|
300
|
450mm
|
31.5
|
25.4
|
37
|
53
|
73
|
89
|
214
|
133
|
450
|
600mm
|
23.9
|
19.2
|
49
|
71
|
97
|
119
|
286
|
177
|
600
|
Code
The table above was generated by the program below.
package main
import (
"fmt"
"math"
)
type Medium struct {
h, v float64
name string
}
func (m Medium) AspectRatio() float64 {
return m.h/m.v
}
var (
MediumAPSC = Medium{25.1, 16.7, "APS-C"}
MediumFF = Medium{36, 24, "35mm"}
MediumMFF = Medium{43.8, 32.8, "GFX"}
MediumMFH = Medium{53.7, 40.2, "H5D"}
MediumLF45 = Medium{121, 97, "4x5"}
MediumLF617 = Medium{170, 60, "6x17"}
MediumLF810 = Medium{254, 203, "8x10"}
)
var Mediums = []Medium {
MediumAPSC,
MediumFF,
MediumMFF,
MediumLF45,
MediumLF617,
MediumLF810,
}
type Lens struct {
focal float64
tc float64
mfg string
}
func (l Lens) String() string {
var s string
if l.mfg != "" {
s = l.mfg + " "
}
s += fmt.Sprintf("%.0fmm", l.focal)
if l.tc == 1.0 {
return s
}
return s + fmt.Sprintf(" (%.1f)", l.tc)
}
func (l Lens) Focal() float64 {
return l.focal * l.tc
}
var LensesAPSC = []Lens {
{10, 1.0, ""},
{14, 1.0, ""},
{16, 1.0, ""},
{18, 1.0, ""},
{35, 1.0, ""},
{50, 1.0, ""},
{55, 1.0, ""},
{56, 1.0, ""},
{60, 1.0, ""},
{80, 1.0, ""},
{90, 1.0, ""},
{200, 1.0, ""},
}
var LensesFF = []Lens{
{14, 1.0, ""},
{16, 1.0, ""},
{17, 1.0, ""},
{19, 1.0, ""},
{20, 1.0, ""},
{24, 1.0, ""},
{28, 1.0, ""},
{35, 1.0, ""},
{45, 1.0, ""},
{50, 1.0, ""},
{85, 1.0, ""},
{105, 1.0, ""},
{120, 1.0, ""},
{200, 1.0, ""},
}
var LensesGFX = []Lens{
{23, 1.0, ""},
{32, 1.0, ""},
{45, 1.0, ""},
{50, 1.0, ""},
{63, 1.0, ""},
{100, 1.0, ""},
{110, 1.0, ""},
{200, 1.0, ""},
{250, 1.0, ""},
}
var LensesPentax = []Lens {
{25, 1.0, ""},
{28, 1.0, ""},
{33, 1.0, ""},
{45, 1.0, ""},
{55, 1.0, ""},
{80, 1.0, ""},
{85, 1.0, ""},
{110, 1.0, ""},
{150, 1.0, ""},
{160, 1.0, ""},
{300, 1.0, ""},
}
var LensesHasselblad = []Lens {
{24, 1.0, ""},
{28, 1.0, ""},
{35, 1.0, ""},
{50, 1.0, ""},
{80, 1.0, ""},
{90, 1.0, ""},
{110, 1.0, ""},
{150, 1.0, ""},
{210, 1.0, ""},
{300, 1.0, ""},
}
func init() {
for _, v := range LensesHasselblad {
v1 := v
v1.tc = 1.5
LensesHasselblad = append(LensesHasselblad, v1)
}
}
func init() {
for _, v := range LensesHasselblad {
v1 := v
v1.mfg = "Hasselblad"
LensesGFX = append(LensesGFX, v1)
}
}
var LensesLF = []Lens {
{72, 1.0, ""},
{90, 1.0, ""},
{150, 1.0, ""},
{240, 1.0, ""},
{300, 1.0, ""},
}
var LensesLF810 = []Lens {
{150, 1.0, ""},
{240, 1.0, ""},
{300, 1.0, ""},
{450, 1.0, ""},
{600, 1.0, ""},
}
type System struct {
Medium
Lenses *[]Lens
Name string
}
var (
SystemAPSC = System{MediumAPSC, &LensesAPSC, "APS-C"}
SystemFF = System{MediumFF, &LensesFF, "35mm full frame"}
SystemGFX = System{MediumMFF, &LensesGFX, "Fuji GFX"}
SystemPentax = System{MediumMFF, &LensesPentax, "Pentax 645"}
SystemHasselblad = System{MediumMFH, &LensesHasselblad, "Hasselblad H5D-60"}
SystemLF45 = System{MediumLF45, &LensesLF, "LF (4x5)"}
SystemLF617 = System{MediumLF617, &LensesLF, "LF (6x17)"}
SystemLF810 = System{MediumLF810, &LensesLF810, "LF (8x10)"}
)
var Systems = []System {
SystemAPSC,
SystemFF,
SystemGFX,
SystemPentax,
SystemHasselblad,
SystemLF45,
SystemLF617,
SystemLF810,
}
func fov(ssize, focal float64) float64 {
return 2 * math.Atan(ssize/(2*focal)) * 180 / math.Pi
}
type LensAll struct {
Lens
HFoV float64
VFoV float64
Eq map[Medium]float64
}
func (la LensAll) String() string {
var s string
s = fmt.Sprintf("|%v\n|%.1f\n|%.1f", la.Lens, la.HFoV, la.VFoV)
for _, m := range Mediums {
s += fmt.Sprintf("\n|%.0f", la.Eq[m])
}
return s
}
func Equivalent(l Lens, m Medium, mtarg Medium) float64 {
if m.AspectRatio() <= mtarg.AspectRatio() {
return l.Focal() * mtarg.v/m.v
}
return l.Focal() * mtarg.h/m.h
}
type SystemEquiv struct {
System
Lenses []LensAll
}
func (se SystemEquiv) String() string {
s := fmt.Sprintf("=== %s ===\n", se.Name)
s += `{| class="wikitable"` + "\n"
s += "|+"+se.Name + "\n"
s += fmt.Sprintf("|-\n")
s += fmt.Sprintf("|Focal length\n")
s += fmt.Sprintf("|Horizontal FOV\n")
s += fmt.Sprintf("|Vertical FOV\n")
for _, m := range Mediums {
s += fmt.Sprintf("|%s\n", m.name)
}
for _, l := range se.Lenses {
s += fmt.Sprintf("|-\n%s\n", l)
}
s += "|}"
return s
}
func main() {
for _, system := range Systems {
se := SystemEquiv{system, nil}
lenses := []LensAll{}
for _, lens := range *system.Lenses {
la := LensAll{Lens: lens}
la.HFoV = fov(system.Medium.h, lens.Focal())
la.VFoV = fov(system.Medium.v, lens.Focal())
la.Eq = make(map [Medium]float64)
for _, m := range Mediums {
la.Eq[m] = Equivalent(lens, system.Medium, m)
}
lenses = append(lenses, la)
}
se.Lenses = lenses
fmt.Println(se)
}
}