Skip to content
Chung Leong edited this page Feb 11, 2024 · 6 revisions

Floats are used to store numbers with decimal parts. There are five types in Zig: f16 (half-precision), f32 (single-precision), f64 (double-precision), f80 (extended precision), and f128 (quadruple-precision). They are all represented in JavaScript as number. Because number is defined by ECMA to be a double-precision float, returning f80 and f128 to JavaScript will result in loss in precision.

const std = @import("std");

pub fn getPi64() f64 {
    return std.math.pi;
}

pub fn getPi80() f80 {
    return std.math.pi;
}

pub fn getPi128() f128 {
    return std.math.pi;
}
import { getPi64, getPi80, getPi128 } from './float-example-1.zig';

console.log(getPi80() === getPi64()); 
console.log(getPi128()  === getPi64());
true
true

Conversely, f32 and f16 can appear to contain more precision than in reality when printed.

const std = @import("std");

pub fn getPi64() f64 {
    return std.math.pi;
}

pub fn getPi32() f32 {
    return std.math.pi;
}

pub fn getPi16() f16 {
    return std.math.pi;
}
import { getPi64, getPi32, getPi16 } from './float-example-2.zig';

console.log(`pi = ${getPi64()}`);
console.log(`pi = ${getPi32()}`);
console.log(`pi = ${getPi16()}`);
pi = 3.141592653589793
pi = 3.1415927410125732
pi = 3.140625

Use toPrecision() to limit the number of digits in the result.

import { getPi64, getPi32, getPi16 } from './float-example-2.zig';

console.log(`pi = ${getPi64()}`);
console.log(`pi = ${getPi32().toPrecision(8)}`);
console.log(`pi = ${getPi16().toPrecision(4)}`);
pi = 3.141592653589793
pi = 3.1415927
pi = 3.141
Clone this wiki locally