基数変換
概要
数の表現ですべての数値に一意の記号を割り当てようとすることは非現実的である。代わりに、古代から有限の記号の組み合わせで任意の数を表現する記数法 (numerical notation) が用いられてきた。現代で一般的に使用されている記数法は位取り記数法 (positional notation) である。この方法はゼロ記号を含む
現代社会では数を 10 進数で表現している一方で、一般的なコンピュータは数を 2 進数で扱っている。このように基数の混合する数値システムでは、ある値を
Table of Contents
- 概要
- 基数変換
- 整数と基数
の数列の変換 - 小数と基数
の数列の変換 - 基数の変換 [under construction]
- 整数と基数
- 参照
- 110進数位取り記法はインドを起源としてアラビア数字とともに中世イスラムを経由してヨーロッパに伝わった。古代の文明はそれぞれで記数法を持っていたが、大きな数値は歴の作成以外に必要なかったため、位取り記数法は必ずしも必要とされていなかった。例えばローマ数字で 28 は XXVIII だが、これは大きな数を表すには不便である [2,3]。
基数変換
ある数値
が負となる境界に小数点を配置し、それより右側は小数を表していることを示す。それ以上の高い位がすべてゼロ記号となる桁、およびそれ以下の低い位がすべてゼロ記号となる桁の表記を省略する: e.g.,
が負の場合にすべての が 0 以下となるが、最左桁の左に単一のマイナス記号を付与することですべての が 0 以下であることを表現する。ここで に対する基数 の数列を求めた結果にマイナス記号を付与しても同じ結果となることに注意: e.g.,
数値
整数と基数 の数列の変換
ある正の整数
同様に、基数
小数と基数 の数列の変換
ある小数
同様に、基数
基数の変換
基数
表現上の数列
一般的に基数変換は
def convert(a:Array[Int], r_a:Int, r_b:Int):Array[Int] = {
val n = a.foldRight(BigInt(0)) { case (a_i, sigma) => sigma * r_a + a_i }
var remaining = n
val b = Buffer[Int]()
while(remaining != 0){
b.append((remaining % r_b).toInt)
remaining /= r_b
}
b.toArray
}
ceil() は浮動小数点演算の誤差に非常に敏感であり、log() も誤差の大きな演算である。例えば:
scala> math.log(3) * 5 / math.log(243)
res31: Double = 1.0000000000000002
特に
参照
- Donald E.Knuth, The Art of Computer Programming Volume 2 Seminumerical Algorithms, KADOKAWA (2015)
- 青本和彦, et al. 岩波数学入門辞典. 岩波書店 2005.
- 小数について(その1)-小数の起源や記法等はどうなっているのか-