···650650(* Encode number *)
651651let encode_number e _meta f =
652652 let value =
653653- if Float.is_nan f then ".nan"
654654- else if f = Float.infinity then ".inf"
655655- else if f = Float.neg_infinity then "-.inf"
656656- else
657657- let s = Printf.sprintf "%.17g" f in
658658- (* Ensure it looks like a number *)
659659- if String.contains s '.' || String.contains s 'e' || String.contains s 'E'
660660- then s
661661- else s ^ ".0"
653653+ match Float.classify_float f with
654654+ | FP_nan -> ".nan"
655655+ | FP_infinite -> if f > 0.0 then ".inf" else "-.inf"
656656+ | _ ->
657657+ if Float.is_integer f && Float.abs f < 1e15 then
658658+ Printf.sprintf "%.0f" f
659659+ else
660660+ Printf.sprintf "%g" f
662661 in
663662 Emitter.emit e.emitter (Event.Scalar {
664663 anchor = None;