Comments (4)
Float behaving as Double in KotlinJS is discussed here.
https://youtrack.jetbrains.com/issue/KT-24975/Enforce-range-of-Float-type-in-JS
from kotlinx-io.
As writeFloat
/readFloat
documentation stated, these functions use Float.toBits
and Float.fromBits
to serialize floats to bitstream and back.
On JS, Floats have a wider range (as they are backed by Number, which is an IEEE 745 double-prevision 64-bit floating point number), so Float.toBits
may produce numbers that are not equal to initial values (see docs).
The only thing we can improve here is stressing this peculiarity in docs.
from kotlinx-io.
Thanks for the clarification. As there is also writeDouble/readDouble, this is very unexpected if you don't know that JS is only using 64-bit floating points underneath. I don't know if it is possible to trim the float values to 32-bit precision stored in a 64-bit variable?
from kotlinx-io.
I don't know if it is possible to trim the float values to 32-bit precision stored in a 64-bit variable?
Sure, it's possible, but with potential precision loss (which is always the case for values that could not be represented exactly, like 0.999
).
While JS Numbers are always double-precision floating point numbers, JS also provides TypedArrays, where values have fixed width in binary representation. When writing values into these arrays, 64-bit fp Numbers are converted to an arrays' type (in fact, semantics is defined for storing in array's buffer, with the float64 to float32 conversion described here).
To "trim" double-precision fp to a single-precision fp, Kotlin's Float.toBits
uses typed arrays with a shared buffer to extract Float's binary representation. As a result, we can get 4 bytes representing a IEEE 754 single-precision fp that was obtained by rounding double-precision Number
backing the Float
.
Float.fromBits
performs transformation in the opposite direction, but reading a value from JS Float32Array
converts it back to Number
with mantissa least significant bits being "zero-padded", leading to 0.999f
not being equal to Float.fromBits(0.999f.toBits())
.
from kotlinx-io.
Related Issues (20)
- Too early force unwrap HOT 1
- Consider moving core IO primitives to the standard library prior to their stabilization
- Investigate the potential mechanisms for project-wide opt-out from unsafe API HOT 6
- Improve SegmentPool test coverage
- Add support for writing other primitive arrays to Buffers HOT 2
- [help] How to read and write a file? HOT 4
- Add a way to check if Path points to a link HOT 2
- `readFromHead`/`writeToTail` should propagate the `Int` returned from the lambda HOT 2
- Lambda-accepting `UnsafeBufferOperations` need contracts for calls-in-place
- Rename `RealSource` and `RealSink` to `BufferedSource` and `BufferedSink` HOT 2
- Should `Source.buffer` be `@UnsafeIoApi` instead of `@InternalIoApi`? HOT 3
- Evaluate use of unsigned numbers for public API HOT 9
- Add support for atomic file creation
- Move smoke pre-release tests to kotlinx-io repo
- Provide Sink/Source implementations writing to stdout/reading from stdin HOT 11
- Use ByteArray.set<Type>At and get<Type>At to read/write from Segments on Native
- Tidy up samples to make them more kotlin-playground-friendly HOT 2
- FileSystem: missing a function to construct an absolute path from a relative one HOT 2
- FS: On Windows, use Win32 API accepting wide string to avoid issues with the file path encoding
- ByteString: provide ByteString-factory overload accepting unsigned bytes
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from kotlinx-io.