2

たとえば、Arduino や C で、30.8365146 を 30 と 8365146 の 2 つの整数に変換するにはどうすればよいですか?

この問題は、端数の送信を許可しないXBeeシリーズ 1 経由でGPSデータを送信しようとすると直面するので、データを 2 つの部分に分割することにしました。これどうやってするの?

私はこのようなことを試しました:

double num=30.233;
int a,b;

a = floor(num); 
b = (num-a) * pow(10,3);

出力は30232! 出力は 30 と 233 ではありません。なぜ、どのように修正できますか?

4

6 に答える 6

1

double を一時的に使用して、float で実行しました。

int fract(float raw) {

    static int digits = std::numeric_limits<double>::digits10 - std::numeric_limits<float>::digits10 - 1;
    float intpart;
    double fract = static_cast<double>(modf(raw, &intpart));
    fract = fract*pow(10, digits - 1);
    return floor(fract);
}

double に対して同じことを達成するために、4 倍精度の浮動小数点形式を使用できると思います: libquadmath

于 2016-11-22T09:30:42.357 に答える
0

30は、切り捨て(math.hのfloor(x))によって抽出できます。

小数点以下の数値は、内部で2進数として格納される可能性が高いため、少し注意が必要です。これは、特に浮動小数点演算が含まれる場合、探している数値にうまく変換されない可能性があります。おそらく、数値を文字列に変換してから、その文字列からデータを抽出するのが最善の策です。

于 2013-03-13T13:46:00.247 に答える
0

floor() を使用して整数値を取得し、num % 1 (モジュロ演算) を使用して小数部分を取得するのはどうですか?

次に、小数部分に 10 の倍数を掛けて丸めることができます。これにより、通信で制限されている場合に、送信する小数点以下の桁数を制御することもできます。標準。

それはうまくいくでしょうか?

#include <math.h>

integer_part = floor(num); 
decimal_part = fmod(num,1)*10^whatever;
于 2013-03-13T17:29:12.237 に答える
0

コメントのように、小数点以下の桁数を追跡する必要があります。整数への直接変換はできません。このようなことをするちょっとしたコード:

#include <stdio.h>
#include <math.h>

#define PLACES 3

void extract(double x)
{
        char buf[PLACES+10];
        int a, b;

        sprintf(buf, "%.*f", PLACES, x);
        sscanf(buf, "%d.%d", &a, &b);

        int n = (int) pow(10, PLACES);

        printf("Number           : %.*f\n", PLACES, x);
        printf("  Integer        : %d\n", a);
        printf("  Fractional part: %d over %d\n", b, n);
}

int main()
{
        extract(1.1128);
        extract(20.0);
        extract(300.000512);
}

プロデュース:

Number           : 1.113
  Integer        : 1
  Fractional part: 113 over 1000
Number           : 20.000
  Integer        : 20
  Fractional part: 0 over 1000
Number           : 300.001
  Integer        : 300
  Fractional part: 1 over 1000
于 2013-03-13T15:04:51.117 に答える