0

floatの桁と小数部分を表す2つの符号なし整数を1つのfloatに変換するにはどうすればよいですか。

これを行うには、小数コンポーネントを浮動小数点数に変換し、それを乗算して小数を取得して桁に追加するなど、いくつかの方法があることを知っていますが、それは最適ではないようです。

私はこれを行うための最適な方法を探しています。

/*
 * Get Current Temp in Celecius.
 */
void  GetTemp(){


    int8_t digit = 0;      // Digit Part of Temp
    uint16_t decimal = 0;  // Decimal Part of Temp

    // define variable that will hold temperature digit and decimal part
    therm_read_temperature(&temperature, &decimal); //Gets the current temp and sets the variables to the value

}

DigitとDecimalのパーツを取得して、digit.decimalのようにfloatタイプに変換したいと思います。

最終的にはこのように見えるかもしれませんが、私は最も最適な解決策を見つけたいと思います。

/*
 * Get Current Temp in Celecius.
 */
float GetTemp(){


    int8_t digit = 0;      // Digit Part of Temp
    uint16_t decimal = 0;  // Decimal Part of Temp

    // define variable that will hold temperature digit and decimal part
    therm_read_temperature(&temperature, &decimal); //Gets the current temp and sets the variables to the value

    float temp = SomeFunction(digit, decimal);  //This could be a expression also. 

    return temp;

}

////更新///-7月5日

ライブラリだけを利用する代わりに、ソースコードを入手することができました。このGISTDS12B20.cに投稿しました。

    temperature[0]=therm_read_byte();
    temperature[1]=therm_read_byte();
    therm_reset();

    //Store temperature integer digits and decimal digits
    digit=temperature[0]>>4;
    digit|=(temperature[1]&0x7)<<4;
    //Store decimal digits
    decimal=temperature[0]&0xf;
    decimal*=THERM_DECIMAL_STEPS_12BIT;

    *digit_part = digit;
    *decimal_part = decimal;

この関数は、数字と小数として別々の部分を返すことを強制しませんが、温度センサーからの読み取りにはこれが必要なようです(何かが足りず、フロートとして取得できる場合を除く)。

元の質問は、2つの部分を使用してこれをCでフロートにする(これはAVRと8ビットマイクロプロセッサで使用し、最適化キーを作成するためのものです)、または次のように直接取得できるようにするための最適な方法はまだあると思いますフロート。

4

2 に答える 2

2

あなたが実際に遭遇しているのは、固定小数点数を使用することです。これらは、2つの方法で表すことができます。既知の大きさまたは乗数を持つ単一の整数(つまり、「10分の1」、「100分の1」、「1000分の1」など)。例:1万分の1のデジタルスケールからの値32ビット整数で保持されるグラム(グラムを取得するには10000で除算します)、または2つの整数として、1つは「累積」または「整数」値を保持し、もう1つは「小数」値を保持します。

<stdfix.h>ヘッダーを見てください。これは、これらの固定小数点数を保持し、それらを使用して数学を実行するための型と関数を宣言します。たとえば、小数部分を追加するときは、次の全体の値にロールインすることを心配する必要があります。そのために、結果のアキュムレータをインクリメントする必要があります。標準機能を使用することにより、AVR、PIC、MPS430マイクロコントローラーに存在するような固定小数点演算用の組み込みプロセッサー機能を利用できます。温度センサー、GPS受信機、スケール(天びん)、および有理数を持ち、整数レジスターまたは算術のみを持つその他のセンサーに最適です。

これに関する記事は次のとおりです。「Cプログラミング言語の固定小数点拡張機能」、https://sestevenson.wordpress.com/2009/09/10/fixed-point-extensions-to-the-c-programming-language/

その記事の一部を引用するには:

拡張機能によって固定型の使用がそれほど単純化されるとは思いません。プログラマーは、整数部分と小数部分に割り当てられているビット数、およびビットの数と位置がどのように変化するか(たとえば、乗算中)を知る必要があります。拡張機能が提供するのは、アセンブリコードを記述せずにプロセッサの飽和モードと丸めモードにアクセスする方法です。このレベルのアクセスを使用すると、これらの操作を処理するためのはるかに効率的なCコードを記述できます。

スコットG.ホールローリー、ノースカロライナ州、米国

于 2012-08-07T21:09:30.263 に答える
1

あなたの質問には間違った仮定が含まれています。

10進文字列が与えられ、浮動小数点値が必要な場合、最初のステップは通常、それを2つの整数に変換することではありません。

たとえば、数字2.1とを考えてみましょう2.01。それぞれの場合の「小数部分」とは何ですか?1と01?どちらも1に等しい。それは良くない。

このアプローチが理にかなっている唯一のケースは、小数点以下の桁数が固定されている場合です。この場合、2.1は(2,1000)になり、2.01は(2,100)になります。しかし、それを行う前向きな理由がない限り(私は強く疑っています)、この方法で行うべきではありません。

特に、therm_read_temperature他の誰かが提供している関数であり、そのインターフェイスに影響を与えることができない場合を除いて、その関数の動作を変える必要があります。たとえば、を返すだけfloatです。(それ他の誰かが提供している関数であり、そのインターフェースに影響を与えることができない場合、ここで有用な答えを得るには、それが何をするように定義されているかを正確に伝える必要があります。)

于 2012-05-13T21:44:08.643 に答える