Блог пользователя simp1eton

Автор simp1eton, 14 лет назад, По-английски
Hi all,

I have some problems with outputting long double.

Here is my code for Yandex Round 1 Problem C Petya and Tree:

http://pastebin.com/sHKuXg15

I submitted this code but got WA for testcase 1, even though it worked on my com. In the end, I realised that I cannot printf long doubles (something similar to printf long long int?), so I changed to cout. However, in that case it seems that I started to output integers :(. All my decimals places got cut off. Can someone help me?
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

I think there is no real need in accuracy, so you may cast your long double to a double.

        printf("%.9lf\n",double(AVG[A[P]]));

Probably there is no way to output long doubles.

UPD:

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
   long double d = 0.12345678910;
   cout << fixed;
   cout << setprecision(12) << d;
   return 0;
}

14 лет назад, # |
Rev. 3   Проголосовать: нравится -14 Проголосовать: не нравится

As far as I know, in C++ long double have the same precision as double.
14 лет назад, # |
  Проголосовать: нравится -8 Проголосовать: не нравится
As far as I know, in C++ long double have the same precision as double.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    In MS compiler - yes, but not in GCC.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +9 Проголосовать: не нравится
    I don't understand why I'm having -2 for my last message, so I'm going to prove that long double exists for some angry trolls and haters.

    Run this code here with GNU and with MS compiler and see the difference.

    GNU:
    Comparing d & ld: 0
    Comparing d & d:  1
    0.00000000000000001851275209518998800000000000000000

    MS:
    Comparing d & ld: 1
    Comparing d & d:  1
    0.00000000000000000000000000000000000000000000000000
14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

ignore
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
long double x;
......

printf("%Lf", x);
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Did you try to run that on gcc compiler?

    #include <cstdio>
    int main()
    {
       long double d = 1;
       printf("%Lf",d);
       return 0;
    }

    It outputs
    0.000000

    MS compiler outputs 1.0... just because there is no difference between double and long double.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится

      What GCC do you use???

      Please, read "man 3 printf":

      "L - A following a, A, e, E, f, F, g, or G conversion corresponds to a long double argument. (C99 allows %LF, but SUSv2 does not.)"

      So...
      % cat >test.cpp <<EOF
      #include <cstdio>
      int main()
      {
      long double d = 1;
      printf("%Lf",d);
      return 0;
      }
      EOF
      % gcc test.cpp && ./a.out
      1.000000
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      However, 

      long double x ;
      ....

      cout << x;
      works pretty fine
      • 14 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

        #include <iostream>
        #include <iomanip>
        using namespace std;
        int main()
        {
           long double d = 0.12345678910;
           cout << fixed;
           cout << setprecision(12) << d;
           return 0;
        }
        =====
        0.123456789100

        YARLY. :-)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
You may use specifier Lg for long double:

long double x;
...
printf("%Lg",x);
with GNU C++
14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Similar question but about Java.
How to output doubles?
It seems that out.printf("%.10f", number); outputs float, not double, but format string "%.10lf" doesn't work.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Why don't you try DecimalFormat class?
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Why not simply "out.print(number);"?
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Some problems require definite number of digits after the decimal point. For big doubles the answer is displayed in form like this 1.325e56 and that is not what I need.
      • 14 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        out.printf("%.16f\n", number); //regarding doc for java.util.Formatter this prints exactly 16 digits after dot without conversation to float

        You can check:
        float floatNumber = 1.f / 3.f;
        double doubleNumber = 1.d / 3.d;
        System.out.printf("%.16f\n", floatNumber);
        System.out.printf("%.16f\n", doubleNumber);

        will print:
        0.3333333432674408
        0.3333333333333333
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    RTFM, %f работает корректно и для double
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Thanks everyone!

May I know what is the difference between a MS compiler and GNU compiler?