Armadilloフォーラム

Armadillo-840でstrtodを使った浮動小数点文字列の変換が出来ない

murata

2016年4月22日 17時27分

お世話になります。村田と申します。

Armadillo-800EVAで動かしていたプログラム(C言語にて実装)をArmadillo-840で動作させようとしたところ、
プログラムの中で標準関数のstrtodを使用して浮動小数点を表現した文字列をdouble型の変数に変換する処理が
期待通りにしないのですが、何か対処方法はございませんでしょうか?
OSは両方ともLinuxです。

動作確認結果と確認用に作成したソース(Makefile)は下記のとおりです。

・Armadillo-800EVAでの実行結果
inputStr=120, double=120.000000, float=120.000000, answer=120.000000
inputStr=12.0, double=12.000000, float=12.000000, answer=12.000000
inputStr=3.14, double=3.140000, float=3.140000, answer=3.140000

文字列が変数の値(double,float)に変換されていて期待通りの動作。

・Armadillo-840での実行結果
inputStr=120, double=0.000000, float=160782474021152277964669563027490603008.000000, answer=120.000000
inputStr=12.0, double=0.000000, float=160782474021152277964669563027490603008.000000, answer=12.000000
inputStr=3.14, double=0.000000, float=160782474021152277964669563027490603008.000000, answer=3.140000

変換結果(double,float)が期待した値と違う値になっている。

ソース

#include <stdio.h>
#include <stdlib.h>
 
#include <errno.h>
 
#define TEST_NUM 3
 
int main(int argc, char* argv[])
{
    char *valStr[TEST_NUM] = {
        "120",
        "12.0",
        "3.14",
    };
    double answer[TEST_NUM] = {120.0, 12.0, 3.14};
 
    double dval;
    float  fval;
    int i;
    for (i = 0; i < TEST_NUM; i++) {
        dval = strtod(valStr[i], NULL);
        fval = strtof(valStr[i], NULL);
        printf("inputStr=%s, double=%f, float=%f, answer=%f\n", valStr[i], dval, fval, answer[i]);
    }
 
    return 0;
}

Makefile

CC = arm-linux-gnueabi-gcc
CFLAGS  = -O3 -I../include -g
LDFLAGS =
LDLIBS  =
 
LN      = $(CC)
RM      = rm -f
 
SRC = doubleVal.c
 
OBJ    = $(SRC:.c=.o)
 
TARGET = double
 
all: $(TARGET)
 
.c.o:
        $(CC) $(CFLAGS) -c  $*.c
 
$(TARGET): $(OBJ)
        $(LN) $(LDFLAGS) -o $@ $(OBJ) $(LDLIBS)
clean:
        $(RM) $(OBJ) $(TARGET)

なお、コンパイル環境とそれぞれの実行環境は下記のとおりです。

コンパイル環境:
 840用開発環境(atde5)でビルドした同じ実行ファイルを800EVA/840でそれぞれ実行
実行環境:
 ・Armadillo-800EVA:内蔵FlashでLinux起動
  カーネル情報:Linux debian 2.6.35-a800eva-at3 #1 PREEMPT Fri Jul 27 16:26:47 JST 2012 armv7l GNU/Linux
 ・Armadillo-840:SDカードブート(製品マニュアルの手順にて作成したもの)
  カーネル情報:Linux armadillo840-0 3.4-at17 #1 PREEMPT Mon Feb 22 20:27:49 JST 2016 armv7l GNU/Linux

ファイル ファイルの説明
src.tar.gz ソースファイルとメイクファイル
コメント

KES)小西です。

armhfとarmelの 違いということはないでしょうか?
ツールチェインを確認してみてはいかがでしょうか?

お早いコメントありがとうございます。

>
> KES)小西です。
>
> armhfとarmelの 違いということはないでしょうか?
> ツールチェインを確認してみてはいかがでしょうか?

arm-linux-gnueabi-gccを使用しておりましたが、
クラスコンパイラをarm-linux-gnueabihf-gccにすることにより期待した結果を
をえることができました。

経験のない現象で困っていましたのでとても助かりました。
ありがとうございます。