Десятичное число по сравнению с удвоенной скоростью

У вас проблема с определением области охвата, поэтому получение этой ошибки:

for(int i = 0; i<nextTextBox;i++) //you are declaring i here

с использованием внутри KeyListener. Это запрещено. Поскольку доступ к переменной local non-final недоступен из внутреннего класса для доступа, он должен быть окончательным. В вашем случае я не думаю, что можно сделать i final

Итак, одно быстрое исправление объявляет i в области класса с помощью JFrame и JPanel

JFrame myMainWindow = new JFrame("Sorts");

JPanel sortPanel = new JPanel();
int i; 

, тогда используйте его где угодно

 for(i = 0; i<nextTextBox;i++)
49
задан Superman 1 December 2008 в 01:02
поделиться

7 ответов

  1. арифметика С плавающей точкой почти всегда будет значительно быстрее, потому что она поддерживается непосредственно аппаратными средствами. До сих пор почти никакая широко используемая десятичная система исчисления поддержки оборудования (хотя это изменяется, см. комментарии).
  2. Финансовые приложения должны всегда десятичные числа использования, количество страшных историй, происходящих от использования плавающей точки в финансовых приложениях, бесконечно, необходимо быть в состоянии найти много таких примеров с поиском Google.
  3. , В то время как десятичная система исчисления может быть значительно медленнее, чем арифметика с плавающей точкой, если Вы не тратите существенное количество времени, обрабатывая десятичные данные, влияние на Вашу программу, вероятно, будет незначительно. Как всегда, сделайте соответствующее профилирование, прежде чем Вы начнете волноваться о различии.
79
ответ дан Robert Gamble 7 November 2019 в 21:21
поделиться

Просто используйте длинное и умножьте на степень 10. После того, как вы закончите, разделите на ту же степень на 10.

8
ответ дан 7 November 2019 в 11:21
поделиться

Всегда используйте Десятичное число для любых финансовых вычислений, или Вы будете навсегда преследовать погрешности округления за 1 цент.

20
ответ дан Craig 7 November 2019 в 21:21
поделиться

Десятичные числа должны всегда использоваться для финансовых вычислений. Размер чисел не важен.

самый легкий путь ко мне для объяснения через некоторый код C#.

double one = 3.05;
double two = 0.05;

System.Console.WriteLine((one + two) == 3.1);

, Что бит кода распечатает Ложь даже при том, что 3.1 равно 3,1...

То же самое..., но десятичное число использования:

decimal one = 3.05m;
decimal two = 0.05m;

System.Console.WriteLine((one + two) == 3.1m);

Это теперь распечатает Верный !

, Если Вы хотите избежать этого вида проблемы, я рекомендую придерживаться десятичных чисел.

6
ответ дан mezoid 7 November 2019 в 21:21
поделиться

Я отсылаю Вас к своему ответу, данному этот вопрос .

Использование длинное, сохраните самую маленькую сумму, которую необходимо отследить и отобразить значения соответственно.

1
ответ дан Community 7 November 2019 в 21:21
поделиться
  1. Да; арифметика программного обеспечения действительно в 100 раз медленнее, чем аппаратные средства. Или по крайней мере, это намного медленнее, и фактор 100, плюс-минус порядок величины, о праве. Назад в плохие былые времена, когда Вы не могли предположить, что каждые 80386 имели 80 387 сопроцессоров с плавающей точкой, тогда у Вас было программное моделирование двоичной плавающей точки также, и это было медленно.
  2. Нет; Вы живете на фэнтезийной земле, если Вы думаете, что чистая двоичная плавающая точка может когда-либо точно представлять все десятичные числа. Двоичные числа могут объединить половины, четверти, восьмые, и т.д., но так как точное десятичное число 0,01 требует двух факторов одной пятой и одного фактора одной четверти (1/100 = (1/4) * (1/5) * (1/5)) и так как одна пятая не имеет никакого точного представления в двоичном файле, Вы не можете точно представить все десятичные значения с двоичными значениями (потому что 0.01 контрпример, который не может быть представлен точно, но представительный для огромного класса десятичных чисел, которые не могут быть представлены точно).

Так, необходимо решить, можно ли иметь дело с округлением перед вызовом ToString () или необходимо ли найти некоторый другой механизм, который будет иметь дело с округлением результатов, поскольку они преобразовываются в строку. Или можно продолжить использовать десятичную систему исчисления, так как это останется точным, и это станет быстрее, как только машины выпущены, которые поддерживают новую десятичную систему исчисления IEEE 754 в аппаратных средствах.

Обязательная перекрестная ссылка: , Что Каждый Программист Должен Знать Об Арифметике С плавающей точкой . Это - один из многих возможных URL.

информация о десятичной системе исчисления и новом стандарте IEEE 754:2008 в этом сайт Speleotrove .

12
ответ дан Jonathan Leffler 7 November 2019 в 21:21
поделиться

Здесь существует две отделимых проблемы. Каждый - имеет ли двойное достаточно точности для содержания всех битов, в которых Вы нуждаетесь, и другой то, где она может представить Ваши числа точно.

Что касается точного представления, Вы правы быть осторожными, потому что точная десятичная дробь как 1/10 не имеет никакого точного двоичного дубликата. Однако, если Вы знаете, что Вам только нужны 5 десятичных цифр точности, можно использовать , масштабировался арифметика, в которой Вы воздействуете на числа, умноженные на 10^5. Так, например, если Вы хотите представить 23.7205 точно, Вы представляете его как 2372050.

Позволяют нам видеть, существует ли достаточно точности: двойная точность дает Вам 53 бита точности. Это эквивалентно 15 + десятичные цифры точности. Таким образом, это позволило бы Вам пять цифр после десятичной точки и 10 цифр перед десятичной точкой, которая кажется вполне достаточной для Вашего приложения.

я поместил бы этот код C в.h файл:

typedef double scaled_int;

#define SCALE_FACTOR 1.0e5  /* number of digits needed after decimal point */

static inline scaled_int adds(scaled_int x, scaled_int y) { return x + y; }
static inline scaled_int muls(scaled_int x, scaled_int y) { return x * y / SCALE_FACTOR; }

static inline scaled_int scaled_of_int(int x) { return (scaled_int) x * SCALE_FACTOR; }
static inline int intpart_of_scaled(scaled_int x) { return floor(x / SCALE_FACTOR); }
static inline int fraction_of_scaled(scaled_int x) { return x - SCALE_FACTOR * intpart_of_scaled(x); }

void fprint_scaled(FILE *out, scaled_int x) {
  fprintf(out, "%d.%05d", intpart_of_scaled(x), fraction_of_scaled(x));
}

существует, вероятно, несколько грубых мест, но этого должно быть достаточно для запущения Вас.

Никакие издержки для дополнения, стоимости умножения или делятся, удваивается.

, Если у Вас есть доступ к C99, можно также попробовать масштабируемую целочисленную арифметику с помощью int64_t 64-разрядный целый тип. То, которое быстрее, будет зависеть от Вашей аппаратной платформы.

23
ответ дан Norman Ramsey 7 November 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: