ЗАО «ЗЭО»

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск  

Новости:

Автор Тема: работа с плавающей точкой  (Прочитано 10482 раз)

0 Пользователей и 1 Гость просматривают эту тему.

MOHOMAX

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 43
работа с плавающей точкой
« : 17 Мая, 2011, 16:36:20 »

Здравствуйте!
У меня проблема при работе с данными типа float или double.
Проблема проявляется несколькими способами:

1. При попытке распознать строку и вытащить из неё значение, значение возвращается неадекватное:
например:
char str[20]="23.31";
char *ptr;
float res;

res=strtof(str,0);
printf("%f\n",res); // выводится значение что то вроде 100002003999383813444421091888.32989018738974897134987

то же самое если использовать
sscanf(str, "%f",&res);


2. При преобразовании типа:
float f=12.3;
int i=(int)f; // i получаем не 12

Причем этот же самый код на PC-шном линуксе работает замечательно. Почему такое может быть?

Тион-про2, linux, КФС от buildroot
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: работа с плавающей точкой
« Ответ #1 : 18 Мая, 2011, 18:15:36 »

> Причем этот же самый код на PC-шном линуксе работает замечательно. Почему такое может быть?

У меня он на PC замечательно не работает.

При сборке с флагом -Wall есть сообщение "warning: implicit declaration of function 'strtof'" ?

Записан

MOHOMAX

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 43
Re: работа с плавающей точкой
« Ответ #2 : 20 Мая, 2011, 02:44:16 »

В аттаче пример программы, на которой проявляется баг.
Вот её полный текст:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char str[] = "2334.45";
    char *ptr;
    float f;

    f = strtof(str, &ptr);

    printf("strtof extracted f=%f\n", f);

    sscanf(str,"%f",&f);
    printf("sscanf extracted f=%f\n", f);

    if(f<2334.451 && f>2334.44)
    {
        printf("f is correct, int=%d\n",(int)f);
    }

    return 0;
}
Собираю программу командой:
/usr/local/arm/4.3.4-armv4t-arm920t-eabi/usr/bin/arm-linux-gcc -Wall -o test test.c

Программа, запущенная на тионе выводит:
Цитировать
# ./test
strtof extracted f=26815622316534459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
sscanf extracted f=26815622316534459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
f is correct, int=2334
#
Судя по всему глючит printf. Но вроде все верно печатаю, разве нет?
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: работа с плавающей точкой
« Ответ #3 : 20 Мая, 2011, 10:29:10 »

Соберите со -static и попробуйте
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: работа с плавающей точкой
« Ответ #4 : 20 Мая, 2011, 12:37:23 »

У меня так (и без -static)

./a.out                                                                       
strtof extracted f=2334.449951                                                 
sscanf extracted f=2334.449951                                                 
f is correct, int=2334

Записан

MOHOMAX

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 43
Re: работа с плавающей точкой
« Ответ #5 : 20 Мая, 2011, 23:31:43 »

со -static у меня программа вообще не запускается:
/usr/local/arm/4.3.4-armv4t-arm920t-eabi/usr/bin/arm-linux-gcc -static -Wall -o test test.c
# ./test
Illegal instruction
#

если собирать с -static-libgcc, то программа запускается, но проблема не исчезает.

А вы на какой платформе запускаете?
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: работа с плавающей точкой
« Ответ #6 : 20 Мая, 2011, 23:42:34 »

> # ./test
> Illegal instruction

У вас видимо на плате что-то не то записано. Покажите что в /lib


> А вы на какой платформе запускаете?

armv4 eabi, ep9315
Записан

MOHOMAX

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 43
Re: работа с плавающей точкой
« Ответ #7 : 21 Мая, 2011, 00:40:05 »

# cd /lib/
# ls
firmware                libdl-0.9.30.3.so       libnsl-0.9.30.3.so      librt-0.9.30.3.so
ld-uClibc-0.9.30.3.so   libdl.so.0              libnsl.so.0             librt.so.0
ld-uClibc.so.0          libgcc_s.so             libpthread-0.9.30.3.so  libuClibc-0.9.30.3.so
libc.so.0               libgcc_s.so.1           libpthread.so.0         libutil-0.9.30.3.so
libcrypt-0.9.30.3.so    libm-0.9.30.3.so        libresolv-0.9.30.3.so   libutil.so.0
libcrypt.so.0           libm.so.0               libresolv.so.0          modules
#
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: работа с плавающей точкой
« Ответ #8 : 21 Мая, 2011, 12:17:15 »

Вы на плате меняли ядро или только КФС?
Записан

MOHOMAX

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 43
Re: работа с плавающей точкой
« Ответ #9 : 21 Мая, 2011, 15:03:42 »

менял и ядро и КФС. Ядро патчил и собирал тулчейном (4.3.4-armv4t-arm920t-eabi), КФС при помощи билдрута.

Цитировать
# uname -a
Linux tion 2.6.20.21 #4 PREEMPT Mon May 2 13:05:53 MSD 2011 armv4tl GNU/Linux
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: работа с плавающей точкой
« Ответ #10 : 23 Мая, 2011, 20:09:35 »

> менял и ядро и КФС

Давайте .config ядра и .config Buildroot'а
Записан

MOHOMAX

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 43
Re: работа с плавающей точкой
« Ответ #11 : 23 Мая, 2011, 22:05:14 »

Linux/linux-2.6.20.21/.config
buildroot-2009.08-rc3/.br_config
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: работа с плавающей точкой
« Ответ #12 : 25 Мая, 2011, 21:05:30 »

Linux/linux-2.6.20.21/.config
# CONFIG_AEABI is not set

buildroot-2009.08-rc3/.br_config
# BR2_ARM_EABI is not set

И как вы хотите собирать с EABI? Используйте или компилятор из собранного вами Buildroot или перенастраивайте на EABI.
Записан

MOHOMAX

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 43
Re: работа с плавающей точкой
« Ответ #13 : 30 Мая, 2011, 10:11:32 »

да, я накосячил... спасибо, что указали где искать проблему.
Пересобрал и КФС и ядро с EABI. Теперь если собирать пример с ключем -static, то все работает, но если ключ убрать, то проблема остается. Подскажите, пожалуйста, с чем это связано?
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: работа с плавающей точкой
« Ответ #14 : 30 Мая, 2011, 17:31:06 »

Вы заменили на плате КФС?
Записан