anchor.diff:                                    {'-InfinityOutParams', ?expr('-infinity')},
                                     {'NanOutParams', ?expr(nan)}]],
       ReadFieldDefFnName = mk_fn(dfp_read_field_def_, MsgName),
  -    gpb_codegen:format_fn(
  -      mk_fn(d_field_, MsgName, FName),
  -      fun(<<0:16,128,127, Rest/binary>>, Z1, Z2, '<InParams>') ->
  -              '<call-read-field>'(Rest, Z1, Z2, 'InfinityOutParams');
  -         (<<0:16,128,255, Rest/binary>>, Z1, Z2, '<InParams>') ->
  -              '<call-read-field>'(Rest, Z1, Z2, '-InfinityOutParams');
  -         (<<_:16,1:1,_:7,_:1,127:7, Rest/binary>>, Z1, Z2, '<InParams>') ->
  -              '<call-read-field>'(Rest, Z1, Z2, 'NanOutParams');
  -         (<<Value:32/little-float, Rest/binary>>, Z1, Z2, '<InParams>') ->
  -              '<call-read-field>'(Rest, Z1, Z2, 'OutParams')
  -      end,
  -      [splice_trees('<InParams>', InParams),
  -       replace_term('<call-read-field>', ReadFieldDefFnName)] ++
  -          OutParamsReplacements).
  -
  -format_double_field_decoder(MsgName, XFieldDef, AnRes, Opts) ->
  -    {#?gpb_field{name=FName}, _IsOneof} = XFieldDef,
  -    Params = decoder_params(MsgName, AnRes),
  -    {InParams, PrevValue} = decoder_in_params(Params, MsgName, XFieldDef,
  -                                              AnRes, Opts),
  -    OutParamsReplacements =
  -        [splice_trees(Marker, updated_merged_params(MsgName, XFieldDef, AnRes,
  -                                                    OutExpr, PrevValue, Params,
  -                                                    Opts))
  -         || {Marker, OutExpr} <- [{'OutParams', ?expr(Value)},
  -                                  {'InfinityOutParams', ?expr(infinity)},
  -                                  {'-InfinityOutParams', ?expr('-infinity')},
  -                                  {'NanOutParams', ?expr(nan)}]],
  -    ReadFieldDefFnName = mk_fn(dfp_read_field_def_, MsgName),
  -    gpb_codegen:format_fn(
  -      mk_fn(d_field_, MsgName, FName),
  -      fun(<<0:48,240,127, Rest/binary>>, Z1, Z2, '<InParams>') ->
  -              '<call-read-field>'(Rest, Z1, Z2, 'InfinityOutParams');
  -         (<<0:48,240,255, Rest/binary>>, Z1, Z2, '<InParams>') ->
  -              '<call-read-field>'(Rest, Z1, Z2, '-InfinityOutParams');
  -         (<<_:48,15:4,_:4,_:1,127:7, Rest/binary>>, Z1, Z2, '<InParams>') ->
  -              '<call-read-field>'(Rest, Z1, Z2, 'NanOutParams');
  -         (<<Value:64/little-float, Rest/binary>>, Z1, Z2, '<InParams>') ->
  -              '<call-read-field>'(Rest, Z1, Z2, 'OutParams')
  -      end,
  -      [splice_trees('<InParams>', InParams),
  -       replace_term('<call-read-field>', ReadFieldDefFnName)] ++
  -          OutParamsReplacements).
  +    Replacements =
  +        [splice_trees('InParams', InParams),
  +         replace_term('<call-read-field>', ReadFieldDefFnName)] ++
  +        OutParamsReplacements,
  +    case Type of
  +        float ->
  +            gpb_codegen:format_fn(
  +              mk_fn(d_field_, MsgName, FName),
  +              fun(<<0:16,128,127, Rest/binary>>, Z1, Z2, 'InParams') ->
  +                      '<call-read-field>'(Rest, Z1, Z2, 'InfinityOutParams');
  +                 (<<0:16,128,255, Rest/binary>>, Z1, Z2, 'InParams') ->
  +                      '<call-read-field>'(Rest, Z1, Z2, '-InfinityOutParams');
  +                 (<<_:16,1:1,_:7,_:1,127:7, Rest/binary>>, Z1, Z2,
  +                  'InParams') ->
  +                      '<call-read-field>'(Rest, Z1, Z2, 'NanOutParams');
  +                 (<<Value:32/little-float, Rest/binary>>, Z1, Z2,
  +                  'InParams') ->
  +                      '<call-read-field>'(Rest, Z1, Z2, 'OutParams')
  +              end,
  +              Replacements);
  +        double ->
  +            gpb_codegen:format_fn(
  +              mk_fn(d_field_, MsgName, FName),
  +              fun(<<0:48,240,127, Rest/binary>>, Z1, Z2, 'InParams') ->
  +                      '<call-read-field>'(Rest, Z1, Z2, 'InfinityOutParams');
  +                 (<<0:48,240,255, Rest/binary>>, Z1, Z2, 'InParams') ->
  +                      '<call-read-field>'(Rest, Z1, Z2, '-InfinityOutParams');
  +                 (<<_:48,15:4,_:4,_:1,127:7, Rest/binary>>, Z1, Z2,
  +                  'InParams') ->
  +                      '<call-read-field>'(Rest, Z1, Z2, 'NanOutParams');
  +                 (<<Value:64/little-float, Rest/binary>>, Z1, Z2,
  +                  'InParams') ->
  +                      '<call-read-field>'(Rest, Z1, Z2, 'OutParams')
  +              end,
  +              Replacements)
  +    end.
   
   assign_to_var(Var, Expr) ->
       ?expr('<Var>' = '<Expr>',
  
positive.code:        replace_term('<call-read-field>', ReadFieldDefFnName),
         splice_trees('<OutParams>', Params2)]).
  
  format_float_field_decoder(MsgName, XFieldDef, AnRes, Opts) ->
      {#?gpb_field{name=FName}, _IsOneof} = XFieldDef,
      Params = decoder_params(MsgName, AnRes),
      {InParams, PrevValue} = decoder_in_params(Params, MsgName, XFieldDef,
  
negative.code:         replace_term('<encode-packed>', PackedFnName)]),
       case BitType of
           float ->
               format_packed_float_encoder(PackedFnName);
           double ->
               format_packed_double_encoder(PackedFnName);
           _ ->
               gpb_codegen:format_fn(
                 PackedFnName,
  