606{
607 int e2, e10 = 0, round_pos, round_limb, radix_pos, first_limb_len,
i,
len,
r,
ret;
608#ifdef _MSC_VER
610#else
612#endif
613 struct bnum *
b = (
struct bnum*)bnum_data;
617 int limb_len, prec;
620
621 if(
flags->Precision == -1)
622 flags->Precision = 6;
623
634
635 while(e2 > 0) {
636 int shift = e2 > 29 ? 29 : e2;
639 }
640 while(e2 < 0) {
641 int shift = -e2 > 9 ? 9 : -e2;
644 }
645 } else {
651 }
652
654 first_limb_len = 1;
655 else
658
659 round_pos =
flags->Precision;
661 round_pos += radix_pos;
663 round_pos++;
664 if (round_pos <= first_limb_len)
665 round_limb =
b->e + (first_limb_len - round_pos) /
LIMB_DIGITS - 1;
666 else
667 round_limb =
b->e - (round_pos - first_limb_len - 1) /
LIMB_DIGITS - 2;
668
669 if (
b->b<=round_limb && round_limb<b->
e) {
670 if (round_pos <= first_limb_len) {
671 round_pos = first_limb_len - round_pos;
672 } else {
675 }
676
677 if (round_pos) {
680 if(!standard_rounding) round_up = (2*
l >=
p10s[round_pos]);
681 else if(2*
l >
p10s[round_pos]) round_up =
TRUE;
682 else if(2*
l ==
p10s[round_pos]) {
683 for(
r = round_limb-1;
r >=
b->b;
r--) {
686 break;
687 }
688 }
689
690 if(!round_up) round_up =
b->data[
bnum_idx(
b, round_limb)] /
p10s[round_pos] & 1;
691 }
692 }
else if(round_limb - 1 >=
b->b) {
696 for(
r = round_limb-2;
r >=
b->b;
r--) {
699 break;
700 }
701 }
702
703 if(!round_up) round_up =
b->data[
bnum_idx(
b, round_limb)] & 1;
704 }
705 }
707
708 if(round_up) {
710 for(
i =
b->b; i < b->
e;
i++) {
712
716 }
720 else
722 if(
i != first_limb_len) {
724 radix_pos++;
725
726 round_pos++;
728 {
729 round_pos = 0;
730 round_limb++;
731 }
732 }
733 }
else if(
i ==
b->e) {
734 first_limb_len = 1;
735 radix_pos++;
737
738 round_pos++;
740 {
741 round_pos = 0;
742 round_limb++;
743 }
744 }
745 }
746 }
747 else if(
b->e <= round_limb) {
748 if(
b->e == round_limb) {
752 for(
r =
b->e-2;
r >=
b->b;
r--) {
755 break;
756 }
757 }
758 }
759 }
760
764 first_limb_len = 1;
765 radix_pos++;
766 }
767
768 if(
flags->Format==
'g' ||
flags->Format==
'G') {
770
771 if(radix_pos>=-3 && radix_pos<=flags->Precision) {
774 flags->Precision -= radix_pos;
775 } else {
778 }
779 }
780
781 if(trim_tail && !
flags->Alternate) {
782 for(
i=round_limb;
flags->Precision>0 &&
i<
b->e;
i++) {
785 else
787
788 if(
i == round_limb) {
790 r = radix_pos +
flags->Precision;
791 else
798 } else {
800 }
801
803 flags->Precision -= limb_len;
804 } else {
808 }
809 }
810
811 if(
flags->Precision <= 0) {
812 flags->Precision = 0;
813 break;
814 }
816 break;
817 }
818 }
819
822 if(
flags->Format==
'f' ||
flags->Format==
'F') {
823 len += (radix_pos > 0 ? radix_pos : 1);
824 }
else if(
flags->Format==
'e' ||
flags->Format==
'E') {
825 radix_pos--;
826 if(!trim_tail || radix_pos) {
828 if(three_digit_exp || radix_pos<-99 || radix_pos>99)
len += 3;
830 } else {
832 }
833 }
834
838
841 if(
flags->Format==
'f' ||
flags->Format==
'F') {
842 if(radix_pos <= 0) {
844 r = pf_puts(puts_ctx, 1,
buf);
847 }
848
850 for(
i=
b->e-1; radix_pos>0 &&
i>=
b->b;
i--) {
853 if(limb_len > radix_pos) {
854 f.Precision = radix_pos;
855 l /=
p10s[limb_len - radix_pos];
856 limb_len = limb_len - radix_pos;
857 } else {
858 f.Precision = limb_len;
860 }
861 radix_pos -=
f.Precision;
863
864 r = pf_puts(puts_ctx,
f.Precision,
buf);
867 }
868
870 for(; radix_pos>0; radix_pos--) {
871 r = pf_puts(puts_ctx, 1,
buf);
874 }
875
878 r = pf_puts(puts_ctx, 1,
buf);
881 }
882
883 prec =
flags->Precision;
885 for(; prec>0 && radix_pos+
LIMB_DIGITS-first_limb_len<0; radix_pos++, prec--) {
886 r = pf_puts(puts_ctx, 1,
buf);
889 }
890
891 for(; prec>0 &&
i>=
b->b;
i--) {
895 if(limb_len > prec) {
897 l /=
p10s[limb_len - prec];
898 } else {
899 f.Precision = limb_len;
901 }
904
905 r = pf_puts(puts_ctx,
f.Precision,
buf);
908 }
909
911 for(; prec>0; prec--) {
912 r = pf_puts(puts_ctx, 1,
buf);
915 }
916 } else {
918 l /=
p10s[first_limb_len - 1];
919
921 r = pf_puts(puts_ctx, 1,
buf);
924
927 r = pf_puts(puts_ctx, 1,
buf);
930 }
931
932 prec =
flags->Precision;
934 for(
i=
b->e-1; prec>0 &&
i>=
b->b;
i--) {
937 limb_len = first_limb_len - 1;
939 }
940
941 if(limb_len > prec) {
943 l /=
p10s[limb_len - prec];
944 } else {
945 f.Precision = limb_len;
947 }
950
951 r = pf_puts(puts_ctx,
f.Precision,
buf);
954 }
955
957 for(; prec>0; prec--) {
958 r = pf_puts(puts_ctx, 1,
buf);
961 }
962
963 if(!trim_tail || radix_pos) {
965 buf[1] = radix_pos < 0 ?
'-' :
'+';
966 r = pf_puts(puts_ctx, 2,
buf);
969
970 f.Precision = three_digit_exp ? 3 : 2;
972 r = pf_puts(puts_ctx,
f.Precision,
buf);
975 }
976 }
977
982}
static BOOL bnum_lshift(struct bnum *b, int shift)
static int bnum_idx(struct bnum *b, int idx)
static BOOL bnum_rshift(struct bnum *b, int shift)
_ACRTIMP double __cdecl frexp(double, int *)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLboolean GLboolean GLboolean b
static unsigned int log10i(unsigned int x)
static void FUNC_NAME() pf_integer_conv(APICHAR *buf, pf_flags *flags, LONGLONG x)
#define FIELD_OFFSET(t, f)