Value class Null safety

Immutable calculator value

Floats are stored in something close to what I think is the 16C's internal format

This format is interesting. It's big-endian BCD. The mantissa is sign-magnitude, with the sign in a nybble that is 0 for positive, and 9 for negative. The exponent is 1000's complement BCD, with a magnitude between 0 and 99 (inclusive). So it looks like:


s = mantissa sign (0/9) m = mantissa magnitude e = exponent (1 is 001, -1 is 0x999, -2 is 0x998, etc)

The most significant digit of the mantissa is always non-zero. In other words, 0.1e-99 underflows to zero. The mantissa is NOT stored in complement form. So, a mantissa of -4.2 is 0x94200000000.

Note that I didn't refer to a ROM image to figure this out, or anything like that. I just asked what the behavior of the real calculator is for a couple of data points. cf.



Value.fromInternal(BigInt internal)


asDouble double
Interpret this value as a floating point, and convert to a double. There is no corresponding asInt method, because the int interpretation depends on the bit size and the sign mode - cf. IntegerSingMode.toBigInt()
floatPrefix String
hashCode int
The hash code for this object. [...]
read-only, override
internal BigInt
The calculator's internal representation of a value, as an unsigned integer of (up to) 64 bits in normal operation (128 for the double integer operations). It's a BigInt rather than an int because Javascript Is Evil (tm). That said, it does let us handle the double integer operations easily.
runtimeType Type
A representation of the runtime type of the object.
read-only, inherited


changeBitSize(BigInt bitMask) Value
isZero(Model<ProgramOperation> m) bool
Determine if this value is zero. In 1's complement mode, -0 isZero, too.
negateAsFloat() Value
noSuchMethod(Invocation invocation) → dynamic
Invoked when a non-existent method or property is accessed. [...]
toJson() String
toString() String
A string representation of this object. [...]


operator ==(Object? other) bool
The equality operator. [...]

Static Properties

fInfinity Value
fNegativeInfinity Value
zero Value
Zero for both floats and ints

Static Methods

fromDouble(double num) Value
fromJson(String v, {BigInt? maxInternal}) Value