ftoa () 구현

G

Guest

Guest
안녕하세요 모두, 나는 () 함수는 표준 C를 ftoa의 implentation 필요합니다.
감사합니다

 
ftoa??

그것은 표준 작동하지 않을 수있습니다.만약 내가 여기가 올바르게 이해해야하는 것입니다 :

플로트 데이터;
숯불 가시 [100];

스프린트 (버피, "% f"로, 데이터);



 
안녕# 포함 <stdlib.h>

typedef 노조 (
오래 패;
플로트 F;
) LF_t;

숯불 * ftoa (f를, int * 상태) 플로트
(
오래 mantissa, int_part, frac_part;
짧은 exp2;
LF_t x;
숯불 * P는;
정적 숯불 outbuf [15];

* 상태 = 0;
(f를 == 0.0 경우)
(
outbuf [0] = '0 ';
outbuf [1] = '.';
outbuf [2] = '0 ';
outbuf [3] = 0;
반환 outbuf;
)
XF는 = f를;

exp2 = (서명 숯불) (XL에 ""23) - 127;
mantissa = (XL에 & 0xFFFFFF) | 0x800000;
frac_part = 0;
int_part = 0;

만약 (exp2 "= 31)
(
* 상태 = _FTOA_TOO_LARGE;
반환 0;
)
다른 경우 (exp2 "-23)
(
* 상태 = _FTOA_TOO_SMALL;
반환 0;
)
다른 경우 (exp2 "= 23)
int_part = mantissa ""(exp2 - 23);
다른 경우 (exp2 "= 0)
(
int_part = mantissa ""(23 - exp2);
frac_part = (mantissa ""(exp2 1)) & 0xFFFFFF;
)
사람 / * 만약 (exp2 "0) * /
frac_part = (mantissa & 0xFFFFFF) ""- (exp2 1);

P는 = outbuf;

(XL에 "0)
* P는 = '-';

(int_part == 0)
* P는 = '0 ';
그 밖의
(
ltoa (10 int_part) P는;
(* p)는 동안
P는 ;
)
* P는 = '.';

(frac_part == 0)
* P는 = '0 ';
그 밖의
(
숯불 m의 최대;

최대 = sizeof () outbuf - (P는 - outbuf) - 1;
만약 (최대 "7)
최대 = 7;
/ * 인쇄 BCD * /
(m = 0 일; 난 "최대; 난 )에 대한
(
/ * frac_part *= 10; * /
frac_part = (frac_part ""3) (frac_part ""1);

* P는 = (frac_part ""24) '0 ';
frac_part & = 0xFFFFFF;
)
/ * '0 '결말을 삭제 * /
(- P는, P는 [0] == '0 '& & P는 [-1]에 대한! ='. '; - p)는
;
P는;
)
* P는 = 0;

반환 outbuf;
)ejoy
최고의 cb30에 대해
미안하지만, 당신이 첨부 파일을 보려면 로그인이 필요합니다

 
안녕하세요 모두 수정된 파일을 24 비트의 IEEE 754 24 비트입니다.즐기다
미안하지만, 당신이 첨부 파일을 보려면 로그인이 필요합니다

 
cb30,

그냥 친절 말씀 드리지만, 지역 변수를 스택에 존재 ""일상의 출구에 죽어.당신의 일상을 조금은 버퍼에 발신자로부터 전달 사용하는 것이 더 안전할 수 :
)

숯불 * ftoa (플로트 f를, int * 상태, 숯불 * 버퍼)

(
...;

반환 버퍼;

)

아니면 malloc ()도 사용할 수있습니다.

안부,
Wenton

 
그냥 추가로 사용하는 '정적 숯불 outbuf 위의 코드를 []'로 지역 변수가 정적으로 메모리에 할당됩니다 없어 죽어가 명확하지 않습니다.그러나, 함수를 다음 전화, 이렇게 뭔가를 처음으로 호출을 덮어 쓰게됩니다

printf ( "% s을 \ n", ftoa (...), ftoa (...)); % s을

작동하지 않습니다.

그것은 항상 좋은 아이디어에서 버퍼를 전달하지만, 잘못 말하는가 버퍼 것입니다 '죽는'.

 
안녕하세요, 저는 PIC를위한 C18 컴파일러 ftoa의 코드를 했어요.하지만 그것을 실행하지 않았어요.에서 프로그램을 반환 "만약 (exp2"= 31) * 상태 = -1; / / _FTOA_TOO_LARGE; "

C18 컴파일러는 IEEE - 754 부동 소수점 표준을 사용합니다.그것을 '그 STANDART 지원하지 않습니다.

어떻게해야 C18 컴파일러 문자열 (4 바이트) 부동 변환할 수 있습니까?
그건 긴급

안부 인사

 
ftoa 주셔서 감사합니다 cb30 () 구현.

하나의 버그를 여기서 발견되었다 "exp2 = (0xFF & (XL에 ""23)) - 127; / * 젭 16 고정 비트 숯불 F2xxx * /

대부분의 프로세서에 대한 서명이 숯불에 캐스팅 될 0xFF과 함께하지만 TI는 16 비트 DSP를 숯불은 16 비트 및 그것과 0xFFFF로되었다.이 문제로 인해 오류가 음수로 변환.

또한, 누가 버퍼에 전달하고자하는 사용자 정적 숯불 [15 msg 대화명 제거]를 ftoa 알고 있어야합니다 ()와 sizeof (msg 대화명)를 사용하여이 일치하지 않는 경우, 오류가 발생할 것입니다.

 

Welcome to EDABoard.com

Sponsor

Back
Top