LoginSignup
1

More than 1 year has passed since last update.

posted at

updated at

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 -
  • Zrounding-to-Zeroを表し、0に向かって丸め込まれる(いわゆる切り捨て)
  • Mrounding-to-Minus-infinityを表し、負の無限大方向へ丸め込まる
  • Prounding-to-Positive-infinityを表し、正の無限大方向へ丸め込まれる(切り上げに近い)
  • Nrounding-to-Nearest-ties-to-evenを表し、最近接丸めを行う(四捨五入に近い)
  • Arounding-to-neArest-ties-to-awayを意味し、最近接丸めを行う(四捨五入に近い)
  • Xrounding-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_tfloat32x4_tに変換する命令はvcvtq_f32_s32である
    • reinterpretの記事でも触れたが、末尾に型が2つ付く場合は<戻り値の要素の型>_<引数の要素の型>で表される
  • 一方で、実数型→整数型への変換では、FPCRレジスタ関係なく、命令ごとに丸め方法が違う
    • なお、非常にややこしいのだが、Arm v7でサポートされているのはrounding-to-zeroのみである
  • なお、float64x2_tからfloat32x2_tへの変換だけ、なぜかrounding-to-nearest-oddという、IEEE754 非準拠の変換モードが使われる命令がある。

おわりに

  • 浮動小数点から整数型、及びその逆変換を紹介した
  • 明日は最終日の予定で、ポエムを書く予定です

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1