/******************************************************************************
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, OCaml, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.
*******************************************************************************/
#include <stdio.h>
#include <stdint.h>
typedef struct
{
int16_t val;
const uint8_t bits;
}Fix16;
typedef struct
{
int32_t val;
const uint8_t bits;
}Fix32;
int16_t fix16_mul(Fix16 a, Fix16 b, uint8_t res_bits);
int32_t fix32_mul(Fix32 a, Fix32 b, uint8_t res_bits);
void fix16_print(Fix16 *fix);
#define fix_mul(a,b,res_bits) _Generic((a), \
Fix16 : fix16_mul, \
Fix32 : fix32_mul \
)((a),(b),(res_bits))
int main()
{
Fix16 fix16_1 = {256<<7,7};
Fix16 fix16_2 = {1,1};
Fix16 result = {fix_mul(fix16_1,fix16_2,7),7};
return 0;
}
int16_t fix16_mul(Fix16 a, Fix16 b, uint8_t res_bits)
{
return ((int32_t)a.val * b.val) >> (a.bits + b.bits - res_bits);
}
int32_t fix32_mul(Fix32 a, Fix32 b, uint8_t res_bits)
{
return ((int64_t)a.val * b.val) >> (a.bits + b.bits - res_bits);
}
void fix16_print(Fix16 *fix)
{
const uint16_t fract = ((float)((fix->val) & ((1<<fix->bits)-1)) / (1<<fix->bits)) * 100;
printf("%d.%3d\n",fix
->val
>>fix
->bits
,fract
); }
LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKV2VsY29tZSB0byBHREIgT25saW5lLgpHREIgb25saW5lIGlzIGFuIG9ubGluZSBjb21waWxlciBhbmQgZGVidWdnZXIgdG9vbCBmb3IgQywgQysrLCBQeXRob24sIEphdmEsIFBIUCwgUnVieSwgUGVybCwKQyMsIE9DYW1sLCBWQiwgU3dpZnQsIFBhc2NhbCwgRm9ydHJhbiwgSGFza2VsbCwgT2JqZWN0aXZlLUMsIEFzc2VtYmx5LCBIVE1MLCBDU1MsIEpTLCBTUUxpdGUsIFByb2xvZy4KQ29kZSwgQ29tcGlsZSwgUnVuIGFuZCBEZWJ1ZyBvbmxpbmUgZnJvbSBhbnl3aGVyZSBpbiB3b3JsZC4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkaW50Lmg+Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBpbnQxNl90IHZhbDsKICAgIGNvbnN0IHVpbnQ4X3QgYml0czsKfUZpeDE2OwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgaW50MzJfdCB2YWw7CiAgICBjb25zdCB1aW50OF90IGJpdHM7Cn1GaXgzMjsKCmludDE2X3QgZml4MTZfbXVsKEZpeDE2IGEsIEZpeDE2IGIsIHVpbnQ4X3QgcmVzX2JpdHMpOwppbnQzMl90IGZpeDMyX211bChGaXgzMiBhLCBGaXgzMiBiLCB1aW50OF90IHJlc19iaXRzKTsKdm9pZCBmaXgxNl9wcmludChGaXgxNiAqZml4KTsKCiNkZWZpbmUgZml4X211bChhLGIscmVzX2JpdHMpIF9HZW5lcmljKChhKSwgXAogIEZpeDE2IDogZml4MTZfbXVsLCAgICBcCiAgRml4MzIgOiBmaXgzMl9tdWwgICAgIFwKICApKChhKSwoYiksKHJlc19iaXRzKSkKCmludCBtYWluKCkKewogIEZpeDE2IGZpeDE2XzEgPSB7MjU2PDw3LDd9OwogIEZpeDE2IGZpeDE2XzIgPSB7MSwxfTsKICBGaXgxNiByZXN1bHQgPSB7Zml4X211bChmaXgxNl8xLGZpeDE2XzIsNyksN307CiAgcHJpbnRmKCJIZWxsbyBXb3JsZCIpOwoKICByZXR1cm4gMDsKfQoKaW50MTZfdCBmaXgxNl9tdWwoRml4MTYgYSwgRml4MTYgYiwgdWludDhfdCByZXNfYml0cykKewogICAgcmV0dXJuICgoaW50MzJfdClhLnZhbCAqIGIudmFsKSA+PiAoYS5iaXRzICsgYi5iaXRzIC0gcmVzX2JpdHMpOwp9CgppbnQzMl90IGZpeDMyX211bChGaXgzMiBhLCBGaXgzMiBiLCB1aW50OF90IHJlc19iaXRzKQp7CiAgICByZXR1cm4gKChpbnQ2NF90KWEudmFsICogYi52YWwpID4+IChhLmJpdHMgKyBiLmJpdHMgLSByZXNfYml0cyk7Cn0KCnZvaWQgZml4MTZfcHJpbnQoRml4MTYgKmZpeCkKewogICAgY29uc3QgdWludDE2X3QgZnJhY3QgPSAoKGZsb2F0KSgoZml4LT52YWwpICYgKCgxPDxmaXgtPmJpdHMpLTEpKSAvICgxPDxmaXgtPmJpdHMpKSAqIDEwMDsKICAgIHByaW50ZigiJWQuJTNkXG4iLGZpeC0+dmFsPj5maXgtPmJpdHMsZnJhY3QpOwp9