|
|
@@ -1,6 +1,7 @@
|
|
|
package jsoniter
|
|
|
|
|
|
import (
|
|
|
+ "fmt"
|
|
|
"math"
|
|
|
"strconv"
|
|
|
)
|
|
|
@@ -13,6 +14,10 @@ func init() {
|
|
|
|
|
|
// WriteFloat32 write float32 to stream
|
|
|
func (stream *Stream) WriteFloat32(val float32) {
|
|
|
+ if math.IsInf(float64(val), 0) || math.IsNaN(float64(val)) {
|
|
|
+ stream.Error = fmt.Errorf("unsupported value: %f", val)
|
|
|
+ return
|
|
|
+ }
|
|
|
abs := math.Abs(float64(val))
|
|
|
fmt := byte('f')
|
|
|
// Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right.
|
|
|
@@ -26,6 +31,10 @@ func (stream *Stream) WriteFloat32(val float32) {
|
|
|
|
|
|
// WriteFloat32Lossy write float32 to stream with ONLY 6 digits precision although much much faster
|
|
|
func (stream *Stream) WriteFloat32Lossy(val float32) {
|
|
|
+ if math.IsInf(float64(val), 0) || math.IsNaN(float64(val)) {
|
|
|
+ stream.Error = fmt.Errorf("unsupported value: %f", val)
|
|
|
+ return
|
|
|
+ }
|
|
|
if val < 0 {
|
|
|
stream.writeByte('-')
|
|
|
val = -val
|
|
|
@@ -54,6 +63,10 @@ func (stream *Stream) WriteFloat32Lossy(val float32) {
|
|
|
|
|
|
// WriteFloat64 write float64 to stream
|
|
|
func (stream *Stream) WriteFloat64(val float64) {
|
|
|
+ if math.IsInf(val, 0) || math.IsNaN(val) {
|
|
|
+ stream.Error = fmt.Errorf("unsupported value: %f", val)
|
|
|
+ return
|
|
|
+ }
|
|
|
abs := math.Abs(val)
|
|
|
fmt := byte('f')
|
|
|
// Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right.
|
|
|
@@ -67,6 +80,10 @@ func (stream *Stream) WriteFloat64(val float64) {
|
|
|
|
|
|
// WriteFloat64Lossy write float64 to stream with ONLY 6 digits precision although much much faster
|
|
|
func (stream *Stream) WriteFloat64Lossy(val float64) {
|
|
|
+ if math.IsInf(val, 0) || math.IsNaN(val) {
|
|
|
+ stream.Error = fmt.Errorf("unsupported value: %f", val)
|
|
|
+ return
|
|
|
+ }
|
|
|
if val < 0 {
|
|
|
stream.writeByte('-')
|
|
|
val = -val
|