質問編集履歴
3
誤字修正
    
        title	
    CHANGED
    
    | 
            File without changes
         | 
    
        body	
    CHANGED
    
    | @@ -1,36 +1,36 @@ | |
| 1 1 | 
             
            #質問概要
         | 
| 2 2 |  | 
| 3 | 
            -
            浮動小数値(float)<->固定 | 
| 3 | 
            +
            浮動小数値(float)<->固定小数値の変換を可能にするアルゴリズムがどうしてうまくいくのかがわかりません。後に示すやり方でなぜうまくいくのか、理由をご教授いただきたいです。
         | 
| 4 4 |  | 
| 5 5 | 
             
            #質問詳細
         | 
| 6 6 | 
             
            このブロックの前段では、質問をわかりやすくするため状況の説明を実際のコードを用いて行っております。
         | 
| 7 7 | 
             
            後段では、何がわからないのかを説明しています。
         | 
| 8 8 |  | 
| 9 | 
            -
            浮動小数値を固定 | 
| 9 | 
            +
            浮動小数値を固定小数値に変換して保持する場合、一般的に以下のアルゴリズムが使われているようです。
         | 
| 10 10 | 
             
            なお、わかりやすさのため、以下のルールに従って変換が行われるものとします
         | 
| 11 | 
            -
            **・**固定 | 
| 11 | 
            +
            **・**固定小数値の小数部分は下位8bit とする。
         | 
| 12 | 
            -
            **・**固定 | 
| 12 | 
            +
            **・**固定小数値は int型の変数(fix)に格納する。
         | 
| 13 13 | 
             
            **・**浮動小数値は float型の変数(floats) とする。
         | 
| 14 14 |  | 
| 15 | 
            -
            **浮動小数→固定 | 
| 15 | 
            +
            **浮動小数→固定小数変換アルゴリズム**
         | 
| 16 16 | 
             
            ```C++
         | 
| 17 17 | 
             
            int float_to_fixed(float floats)
         | 
| 18 18 | 
             
            {
         | 
| 19 19 | 
             
            	int ret;
         | 
| 20 20 |  | 
| 21 | 
            -
            	ret = (int)(roundf(floats * (1 << 8)));//所与の浮動小数値 ☓ 2^(固定 | 
| 21 | 
            +
            	ret = (int)(roundf(floats * (1 << 8)));//所与の浮動小数値 ☓ 2^(固定小数部のbit 数)
         | 
| 22 22 |  | 
| 23 23 | 
             
            	return (ret);
         | 
| 24 24 | 
             
            }
         | 
| 25 25 | 
             
            ``` 
         | 
| 26 | 
            -
            **固定 | 
| 26 | 
            +
            **固定小数→浮動小数変換アルゴリズム**
         | 
| 27 27 | 
             
            ```C++
         | 
| 28 28 |  | 
| 29 29 | 
             
            float fixed_to_float(int fixed)
         | 
| 30 30 | 
             
            {
         | 
| 31 31 | 
             
            	float ret;
         | 
| 32 32 |  | 
| 33 | 
            -
            	ret = ((float)fixed / (float)(1 << 8));//固定少数値をfloatにキャストして、2^(固定小数値の小数部分のbit数)
         | 
| 33 | 
            +
            	ret = ((float)fixed / (float)(1 << 8));//固定少数値をfloatにキャストして、2^(固定小数値の小数部分のbit数)で割る
         | 
| 34 34 |  | 
| 35 35 | 
             
            	return (ret);
         | 
| 36 36 | 
             
            }
         | 
| @@ -42,14 +42,14 @@ | |
| 42 42 | 
             
            2 : https://medium.com/incredible-coder/converting-fixed-point-to-floating-point-format-and-vice-versa-6cbc0e32544e
         | 
| 43 43 |  | 
| 44 44 |  | 
| 45 | 
            -
            上に示した2つの関数について、どうしてこの方法で浮動小数が固定 | 
| 45 | 
            +
            上に示した2つの関数について、どうしてこの方法で浮動小数が固定小数に変換できるのかわかりません。
         | 
| 46 46 |  | 
| 47 47 | 
             
            #####わからない理由を以下に示します。
         | 
| 48 48 | 
             
            自分の理解では、floatと固定少数はbitを考えた時構造が全く違うと理解しています。  
         | 
| 49 | 
            -
            浮動小数値は、符号部・指数部・仮数部に別れます。しかし、固定 | 
| 49 | 
            +
            浮動小数値は、符号部・指数部・仮数部に別れます。しかし、固定小数値は、符号部・整数部・小数部にbitが別れています。だから、いくらbitシフトさせようと浮動小数点は固定小数に変換できないと思ってしまいます。そもそも各bit の役割がぜんぜん違うからです。
         | 
| 50 50 |  | 
| 51 | 
            -
            int型などの整数値を固定 | 
| 51 | 
            +
            int型などの整数値を固定小数値に変換するのは理解できます。
         | 
| 52 | 
            -
            整数値は、第1bitの右にバイナリポイント( | 
| 52 | 
            +
            整数値は、第1bitの右にバイナリポイント(小数点)があると理解できるので、固定小数に治す場合は小数部のbit分だけ、左bitシフトすればいいからです。
         | 
| 53 53 |  | 
| 54 54 | 
             
            質問の意図伝わりましたでしょうか?
         | 
| 55 55 | 
             
            お力をお貸しください。
         | 
2
呉時
    
        title	
    CHANGED
    
    | 
            File without changes
         | 
    
        body	
    CHANGED
    
    | @@ -49,7 +49,7 @@ | |
| 49 49 | 
             
            浮動小数値は、符号部・指数部・仮数部に別れます。しかし、固定少数値は、符号部・整数部・少数部にbitが別れています。だから、いくらbitシフトさせようと浮動小数点は固定少数に変換できないと思ってしまいます。そもそも各bit の役割がぜんぜん違うからです。
         | 
| 50 50 |  | 
| 51 51 | 
             
            int型などの整数値を固定少数値に変換するのは理解できます。
         | 
| 52 | 
            -
            整数値は、第1bitの | 
| 52 | 
            +
            整数値は、第1bitの右にバイナリポイント(少数点)があると理解できるので、固定少数に治す場合は小数部のbit分だけ、左bitシフトすればいいからです。
         | 
| 53 53 |  | 
| 54 54 | 
             
            質問の意図伝わりましたでしょうか?
         | 
| 55 55 | 
             
            お力をお貸しください。
         | 
1
質問詳細の説明追加
    
        title	
    CHANGED
    
    | 
            File without changes
         | 
    
        body	
    CHANGED
    
    | @@ -3,7 +3,9 @@ | |
| 3 3 | 
             
            浮動小数値(float)<->固定少数値の変換を可能にするアルゴリズムがどうしてうまくいくのかがわかりません。後に示すやり方でなぜうまくいくのか、理由をご教授いただきたいです。
         | 
| 4 4 |  | 
| 5 5 | 
             
            #質問詳細
         | 
| 6 | 
            -
            このブロックの前段では、質問をわかりやすくするため状況の説明を
         | 
| 6 | 
            +
            このブロックの前段では、質問をわかりやすくするため状況の説明を実際のコードを用いて行っております。
         | 
| 7 | 
            +
            後段では、何がわからないのかを説明しています。
         | 
| 8 | 
            +
             | 
| 7 9 | 
             
            浮動小数値を固定少数値に変換して保持する場合、一般的に以下のアルゴリズムが使われているようです。
         | 
| 8 10 | 
             
            なお、わかりやすさのため、以下のルールに従って変換が行われるものとします
         | 
| 9 11 | 
             
            **・**固定性数値の小数部分は下位8bit とする。
         | 
