Sida 1 av 1

Hur räkna ut detta utan flyttal?

Postat: 11 juni 2007, 19:02:56
av Erik_Lind
Jag skulle behöva göra följande uträkning utan att använda flyttal:

Jag misstänker att om man förstår sig på mattematik så borde det gå.

reg0 = 37758;
reg1 = 1;

svar = 3,2*(reg1+(reg0/65536))

--

Kod: Markera allt

#include <inttypes.h>

int main(void)
{
  uint16_t reg0, reg1;
  float result = 0;

  reg0 = 37758;
  reg1 = 1;

  result = 3.2*((float)(reg1)+(float)(reg0)/65536.0);

  printf("\r\n%6.5fns\r\n", result); // Svar 5.04365ns

}

Postat: 11 juni 2007, 19:15:26
av karlstedt
fixed point är en användbar metod

Postat: 11 juni 2007, 19:30:28
av Erik_Lind
Jo, jag tycker man hör det lite då och då.
Men jag har aldrig förstått mig på det där med fixed point.

Postat: 11 juni 2007, 19:31:31
av sodjan
Att 65536 = 2^16 är ju en bra "hint" att det sannolikt
finns någon enkel "binär" metod att lösa det. I alla fall
divisionen (16 bit-shift till höger) :-)

Men ofta ligger svaret på dessa frågor i förståelsen av var
datat kommer från. Någon slags givare eller tidmätning kanske ?

Postat: 11 juni 2007, 19:39:54
av Erik_Lind
Jo, jag läser in en tid och får den i följande format:

----------
Register contents resulting value
Integer portion.Fractional portion

0x0001.ABCD 1.671096 (result of: 1+43981/65536)
-----------

där
reg0 = 0x0001
reg1 = 0xABCD

Sen har jag en klocka som ger mig en periodtid på 3.2us
Så talet ovan är alltså (1.671096 * 3,2 ) 5,3475ns

Postat: 11 juni 2007, 20:22:27
av Icecap
3,2*(reg1+(reg0/65536)) = t i ns

Kan omskrivas till

(3200 * (reg1 * 65536 + reg0)) / 65536 = t i ps

3200 * 109517 = 3504544 / 65536 = 5347 ps = 5,347 ns

Bara heltal.....

Postat: 11 juni 2007, 22:00:29
av Erik_Lind
Stort tack.

Det var precis så jag ville ha det.

/Erik