forked from github/server
when make_frac cannot find a gcd, cheat.
This commit is contained in:
parent
040485504d
commit
33b98b59ec
|
@ -2,6 +2,7 @@
|
||||||
#include "variant.h"
|
#include "variant.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
const variant frac_zero = { .sa = { 0, 1 } };
|
const variant frac_zero = { .sa = { 0, 1 } };
|
||||||
|
@ -41,8 +42,13 @@ variant frac_make(int num, int den)
|
||||||
int g = gcd(num, den);
|
int g = gcd(num, den);
|
||||||
num /= g;
|
num /= g;
|
||||||
den /= g;
|
den /= g;
|
||||||
assert(num >= SHRT_MIN && num <= SHRT_MAX);
|
if (num < SHRT_MIN || num > SHRT_MAX || den < SHRT_MIN || den > SHRT_MAX) {
|
||||||
assert(den >= SHRT_MIN && den <= SHRT_MAX);
|
int a = abs(num/SHRT_MIN) + 1;
|
||||||
|
int b = abs(den/SHRT_MIN) + 1;
|
||||||
|
if (b>a) a = b;
|
||||||
|
num /= a;
|
||||||
|
den /= a;
|
||||||
|
}
|
||||||
v.sa[0] = (short)num;
|
v.sa[0] = (short)num;
|
||||||
v.sa[1] = (short)den;
|
v.sa[1] = (short)den;
|
||||||
return v;
|
return v;
|
||||||
|
|
Loading…
Reference in New Issue