Skip to content

Commit

Permalink
Convert floating to fixed point by rounding, not truncation
Browse files Browse the repository at this point in the history
Fixes gbdev#678
  • Loading branch information
Rangi42 authored and ISSOtm committed Jan 4, 2021
1 parent 7e3fc1d commit 7ce5cf1
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 2 deletions.
3 changes: 2 additions & 1 deletion src/asm/lexer.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <math.h>
#include <limits.h>
#include <stdbool.h>
#include <stdint.h>
Expand Down Expand Up @@ -1130,7 +1131,7 @@ static void readFractionalPart(void)
/* Cast to unsigned avoids UB if shifting discards bits */
yylval.nConstValue = (uint32_t)yylval.nConstValue << 16;
/* Cast to unsigned avoids undefined overflow behavior */
uint16_t fractional = value * 65536 / divisor;
uint16_t fractional = (uint16_t)round(value * 65536.0 / divisor);

yylval.nConstValue |= fractional * (yylval.nConstValue >= 0 ? 1 : -1);
}
Expand Down
2 changes: 1 addition & 1 deletion src/asm/math.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
#include "asm/warning.h"

#define fx2double(i) ((double)((i) / 65536.0))
#define double2fx(d) ((int32_t)((d) * 65536.0))
#define double2fx(d) ((int32_t)round((d) * 65536.0))

#ifndef M_PI
#define M_PI 3.14159265358979323846
Expand Down
11 changes: 11 additions & 0 deletions test/asm/fixed-point-precision.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
f1 = 3.1
f2 = 5.2
pm = MUL(f1, f2)
pr = 16.12
println "`3.1`: {9.6f:f1} -> ${08x:f1}"
println "`5.2`: {9.6f:f2} -> ${08x:f2}"
println "`MUL`: {9.6f:pm} -> ${08x:pm}"
println "`16.12`: {9.6f:pr} -> ${08x:pr}"

fl = 6.283185
println "`6.283185`: {.6f:fl} -> ${08x:fl}"
Empty file.
5 changes: 5 additions & 0 deletions test/asm/fixed-point-precision.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
`3.1`: 3.100007 -> $0003199a
`5.2`: 5.199997 -> $00053333
`MUL`: 16.120026 -> $00101eba
`16.12`: 16.119996 -> $00101eb8
`6.283185`: 6.283188 -> $0006487f
Binary file modified test/asm/underscore-in-numeric-literal.out.bin
Binary file not shown.

0 comments on commit 7ce5cf1

Please sign in to comment.