Last Updated on 2024年6月28日 by らくろぐ
Webツール第6弾。前回の固定小数点変換ツールは2進数で表現しましたが、今回は16進数で出力する形式にしました。Qフォーマットの小数点の位置を指定できるように対応したツールを用意しました。
Contents
固定小数点の表し方
まず、おさらいからです。固定小数点の表記の仕方。以下の記事を参考にしてください。
固定小数点を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;">
この中の処理は以下の通りです。
- 入力された変換する10進数の小数点を取得する。
- 選択した桁数をチェックする
- 入力された小数点位置を取得する
- 入力した小数点桁数が②で選択した桁数より多かったらエラーを表示
- 整数部分を絶対値として取得する。(Math.floor)
- この時、①で選択した桁数ではオーバーフローする場合、算出した桁数に上書きする。
- 整数部分を2進数に変換し表示用のバッファに入れる
- 小数点位置を表示するため”.”をバッファに1文字追加する
- 小数点部分のみを2進数に変換し、表示用のバッファに入れる。
- 2進数から16進数に変換するために、2ビット表記部分を数値に変換して配列にいれる。
- 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フォーマットの形式で定義することが多いので、サンプルデータを作成する等、利用していただければうれしいです。
コメントを残す