はじめに
- この記事はひとりNEONアドベントカレンダー2020 24日目の記事です。
- クリスマスイブですね。皆様いかがお過ごしですか
- 昨日は転置命令を紹介した
- 今日は、ポエムを書く予定だったけれど、変換命令
cvt
を紹介する
可能な変換早見表
| to \ from | s16
| u16
| f16
| s32
| u32
| f32
| s64
| u64
| f64
|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|s16
| - | - |ZAMNP
| - | - | - | - | - | - |
|u16
| - | - |ZAMNP
| - | - | - | - | - | - |
|f16
|C
|C
| - | - | - | C
| - | - | - |
|s32
| - | - | - | - | _ |ZAMNP
| - | - | - |
|u32
| - | - | - | - | - |ZAMNP
| - | - | - |
|f32
| - | - | C
|C
|C
| - | - | - |CX
|
|s64
| - | - | - | - | - | - | - | - |ZAMNP
|
|u64
| - | - | - | - | - | - | - | - |ZAMNP
|
|f64
| - | - | - | - | - | C
|C
|C
| - |
-
Z
はrounding-to-Zero
を表し、0に向かって丸め込まれる(いわゆる切り捨て) -
M
はrounding-to-Minus-infinity
を表し、負の無限大方向へ丸め込まる -
P
はrounding-to-Positive-infinity
を表し、正の無限大方向へ丸め込まれる(切り上げに近い) -
N
はrounding-to-Nearest-ties-to-even
を表し、最近接丸めを行う(四捨五入に近い) -
A
はrounding-to-neArest-ties-to-away
を意味し、最近接丸めを行う(四捨五入に近い) -
X
はrounding-to-nearest-odd
を表し、最近接丸めを行う(四捨五入に近い) -
C
は丸めモードがFPCR
レジスタで制御される。デフォルトは切り捨て(rounding-to-zero
)
IEEE 754 で制定されている丸め方法
- IEEE 754で制定されている丸め方法は、以下の5種類が制定されている
rounding-to-zero
rounding-to-minus-infinity
rounding-to-positive-infinity
rounding-to-nearest-ties-to-even
rounding-to-nearest-ties-to-away
- 最新版はIEEE 754-2019が発行されている
- このあたり、だめぽラボさんの浮動小数点数小話を参考にして読んだ。
- IEEE 754-2019に即して、とても厳密に、詳しく解説している良書である
NEONでの変換命令
- 先程の早見表を見れば分かる通り、整数型→実数型への変換は、
FPCR
レジスタによって丸め方法が決まる- まあ、整数を実数にするのなら大きい数値を使わない限り、別段心配しなくても良い
-
int32x4_t
をfloat32x4_t
に変換する命令はvcvtq_f32_s32
である -
reinterpret
の記事でも触れたが、末尾に型が2つ付く場合は<戻り値の要素の型>_<引数の要素の型>
で表される
- 一方で、実数型→整数型への変換では、
FPCR
レジスタ関係なく、命令ごとに丸め方法が違う- なお、非常にややこしいのだが、Arm v7でサポートされているのは
rounding-to-zero
のみである
- なお、非常にややこしいのだが、Arm v7でサポートされているのは
- なお、
float64x2_t
からfloat32x2_t
への変換だけ、なぜかrounding-to-nearest-odd
という、IEEE754 非準拠の変換モードが使われる命令がある。
おわりに
- 浮動小数点から整数型、及びその逆変換を紹介した
- 明日は最終日の予定で、ポエムを書く予定です