10進数を固定小数点(Qフォーマット)で表現する~Webツール便利帳

Last Updated on 2024年2月2日 by らくろぐ

Webツール第6弾。前回の固定小数点変換ツールは2進数で表現しましたが、今回は16進数で出力する形式にしました。Qフォーマットの小数点の位置を指定できるように対応したツールを用意しました。

固定小数点の表し方

まず、おさらいからです。固定小数点の表記の仕方。以下の記事を参考にしてください。

固定小数点を16進数に変換するツール

10進数の小数点を2進数の固定小数点表記に変換してくれるツールを改変して、Qフォーマットの整数部分の桁数を指定して、変換してくれるツールです。

固定小数点(Qフォーマット)変換ツール
桁数の設定とQフォーマット

小数点位置

2進数に変換する小数(10進数)を入力してください。


変換の実行
結果:2進数
結果:16進数

使い方

  • 表記する桁数を選択します。(8bit/16bit/32bit)
  • 小数点位置を入力します。Q9.23フォーマットなら(整数部9bit)9を入力します。
  • 2進数に変換したい小数点を入力します(負の数値は未対応)
  • 変換実行ボタンを押下します。
  • 2進数と16進数に変換した結果がそれぞれに表示されます

Qフォーマット表記

固定小数点で表現する場合、小数点の位置が固定になります。この小数点の位置を示す表現方法がQフォーマットです。

たとえば、16bitのうち、整数部を15ビットで表記する場合はQ15.1となります。そうするとおのずと整数範囲が決まってきますね

おさらい:WordpressにJavascriptを組み込むのは同じ手法

この変換処理部分もJavascriptを使用しました。wordpressでJavascriptを取り込む手法は以下の記事を参照ください。

処理部分を分けて解説します

2進数への変換

変換する関数を”goConvert()”に組み込んでいます。

 <div>変換の実行</div>

<input type = button value = "変換実行" onclick = "goConvert();" style="padding:5px 10px 5px 10px; font-size: 12px;">

この中の処理は以下の通りです。

  1. 入力された変換する10進数の小数点を取得する。
  2. 選択した桁数をチェックする
  3. 入力された小数点位置を取得する
  4. 入力した小数点桁数が②で選択した桁数より多かったらエラーを表示
  5. 整数部分を絶対値として取得する。(Math.floor)
  6. この時、①で選択した桁数ではオーバーフローする場合、算出した桁数に上書きする。
  7. 整数部分を2進数に変換し表示用のバッファに入れる
  8. 小数点位置を表示するため”.”をバッファに1文字追加する
  9. 小数点部分のみを2進数に変換し、表示用のバッファに入れる。
  10. 2進数から16進数に変換するために、2ビット表記部分を数値に変換して配列にいれる。
  11. 16進数に変換し、表示用バッファに入れる

機能の実装

実際のコードは以下のようにしました。負のマイナスが入ったときのエラー処理は入れていません。

            function goConvert()
 {
const v = document.querySelector("input[name = input]").value
let isError = 0

//桁数のチェック
const bitsel = document.querySelector("input[name=radiobtn3]:checked").value
let numofcnt = 0;
switch (bitsel){
case "00":
numofcnt = 8
break
case "01":
numofcnt = 16
break
case "02":
numofcnt = 32
break
}

const pointpos = document.querySelector("input[name=inputqf]").value
let temp1,temp2,mod,maxValue;
const arry_max=[];//整数部+小数点
const arry=[];
temp1 = v;

//小数点位置を算出
maxValue = Math.floor(temp1);

//小数点位置を算出する
//指定した小数点位置と桁数を比較する。
//桁数より小数点位置が大きい場合はエラーで返す


if( pointpos > numofcnt){
switch(numofcnt){
case 8:
append("7以下にしてください")
break
case 16:
append("15以下にしてください")
break
case 32:
append("31以下にしてください")
break
}
return
}

arry.length = numofcnt-pointpos;
const string = maxValue.toString(2);
var diff = pointpos- string.length;
if( diff >0 ){
for (i =0; i < diff ; i++){
arry_max[i]=0;
}
}

for (i = 0; i < pointpos - diff ; i++){
arry_max[i+diff] = string.substr( i, 1 );
}

arry_max[pointpos]=".";

temp1 = v - maxValue;
for (i = 0; i < arry.length; i++){
temp2 = temp1 % (Math.pow(2,-(i+1)));
mod = Math.floor(temp1 / Math.pow(2,-(i+1)));
arry[i]=mod;
if( temp2 == 0){
for ( s = i; s < arry.length-i; s++){
arry[s+1]=0;
}
break;
}
temp1 = temp2;
}

update("");
//配列を表示に入れる
for(i=0; i < arry_max.length; i++){
append(arry_max[i]);
}

for(i=0; i < arry.length; i++){
append(arry[i]);
}

//16進数に変換する
let tempstring ="";
for(i = 0; i < pointpos; i++){
tempstring = tempstring + arry_max[i];
}

for(i = 0; i < arry.length; i++){
tempstring = tempstring +arry[i];
}

const ans10 = parseInt(tempstring,2);
const ans16 = ans10.toString(16);
update_hex(ans16);
}

Qフォーマット対応の固定小数点方式の2進数で表現する、まとめ

Qフォーマットの形式を学びながら、固定小数点位置を入力し、16進数に変換するプログラムを作成しました。フィルタの係数を計算する等、桁数の多い処理関数の入出力のIFをQフォーマットの形式で定義することが多いので、サンプルデータを作成する等、利用していただければうれしいです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA