[ create a new paste ] login | about

Link: http://codepad.org/AZcD1P5Y    [ raw code | output | fork ]

C, pasted on Sep 26:
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <stdint.h>

typedef struct divmod10_t
{
    uint32_t quot;
    uint8_t rem;
} divmod10_t;

inline static divmod10_t divmodu10(uint32_t n)
{
    divmod10_t res;
// умножаем на 0.8
    res.quot = n >> 1;
    res.quot += res.quot >> 1;
    res.quot += res.quot >> 4;
    res.quot += res.quot >> 8;
    res.quot += res.quot >> 16;
    uint32_t qq = res.quot;
// делим на 8
    res.quot >>= 3;
// вычисляем остаток
    res.rem = (uint8_t)(n - ((res.quot << 1) + (qq & ~7ul)));
// корректируем остаток и частное
    if(res.rem > 9)
    {
        res.rem -= 10;
        res.quot++;
    }
    return res;
}

char * utoa_fast_div(uint32_t value, char *buffer)
{
    buffer += 11;
    *--buffer = 0;
    do
    {
        divmod10_t res = divmodu10(value);
        *--buffer = res.rem + '0';
        value = res.quot;
    }
    while (value != 0);
    return buffer;
}


int main()
{
    char buffer1[20];
    char buffer2[20];
    uint32_t i;

    for(i = 0; i < 0xffffffff; i++)
    {
        char *str1 = utoa_fast_div(i, buffer1);
        sprintf(buffer2, "%u", i);
        if(strncmp(str1, buffer2, sizeof(buffer1)) != 0)
        {
            printf("AHUNG!!! %s != %s\r\n", str1, buffer2);
        }
        if((i & 0xfffff) == 0)
        {
            printf("%4.2f %\r\n", (i >> 20) / 2048.0 * 100);
        }
    }
    
    return 0;
}


Output:
1
Timeout


Create a new paste based on this one


Comments: