Различают число (типа double) с десятичными разрядами и число без - c ++ - PullRequest
3 голосов
/ 24 марта 2011

Я пытаюсь реализовать простой алгоритм прореживания в C ++.У меня есть два массива, скажем p & q, где индексы связаны друг с другом следующим соотношением:

p[k] = q[0.5*k].Это означает, что следующая последовательность должна считаться действительной:

p[0] = q[0]  
p[1] = 0  
p[2] = q[1]  
p[3] = 0  
p[4] = q[2]  

и т. Д. *

Обратите внимание, что p[k] принимает значение только и только тогда, когда результат (0.5*k) не содержит десятичных знаков (или имеет 0 в десятичном виде) и не использует никаких округлений и т. д.

Мой вопрос: Есть ли способ отличить целое число (число сбез десятичных разрядов или только 0 в десятичном, скажем 2.0) и число с десятичными разрядами в C ++, при условии, что оба приводятся к удвоению?

например.) 2.0 - это целочисленное приведение к удвоению.2.1 - число с десятичными разрядами.
например.2) * 0,9 * 2 должно поместить 0 в массив p, в то время как 0,9 * 10 должно положить q [9] в массив p. *

Если я использую оператор (int) (0.5*k), то получаю целое числов любом случае, независимо от значения k.

Редактировать: Значение 0,5 в приведенном выше случае является только иллюстративным.Это может быть любое число, например 2, 2,5, 0,9, 0,95 и т. Д.)

Любая помощь приветствуется,
Спасибо,
Шрирам.

Ответы [ 6 ]

3 голосов
/ 24 марта 2011

Предполагая, что k имеет целочисленный тип, вы можете использовать if (k % 2 == 0) ..., чтобы проверить, делится ли k на два:

if (k % 2 == 0)
  p[k] = q[k / 2];
else
  p[k] = 0;

Это также можно выразить с помощью троичного оператора:

p[k] = (k % 2 == 0) ? q[k / 2] : 0;
2 голосов
/ 24 марта 2011

Предполагая, что коф может быть чем-то еще,

p[floor(coef*k)] = (fabs(coef*k-floor(coef*k))<1E-6)?q[k]:0;
1 голос
/ 24 марта 2011

k% 2 находится в нескольких ответах в этой теме.

Однако, это бесполезно для ответа на вопрос ОП. Обратите внимание на редактирование: «Изменить: 0,5 в приведенном выше случае является только иллюстративным. Это может быть любое число, скажем 2, 2,5, 0,9, 0,95 и т. Д.)»

k% 2 работает только потому, что выбрано значение 0,5. Это не будет справедливо для любых других значений.

Поэтому, если я что-то упустил полностью, самый простой подход, который я могу придумать, заключается в следующем:

Вычтите пол номера из самого числа. Если результат> 0, это не целое число.

1 голос
/ 24 марта 2011

Краткий синтаксис того, что вы хотите сделать, может быть таким:

p[k] = k % 2 ? 0 : q[k/2];

Есть ли способ отличить целое число от целого числа в C ++?

Определить целое число и определить целое число в этом контексте. Я в замешательстве!

Вы понимаете разницу, как объяснено здесь?

Если вы хотите определить, является ли число целым или нет, то, вероятно, это может помочь:

#include<cmath>

bool IsInteger(double d)
{  
    double intpart;
    return std::modf(double number, &intpart) == 0.0;
}
0 голосов
/ 24 марта 2011

@ Предложение Aix о k%2 выглядит так, как будто оно прекрасно сочетается с оператором ?::

p[k] = (k%2) ? 0 : q[k/2];
0 голосов
/ 24 марта 2011

Если у вас нет выражений, которые приводят к иррациональным числам, вы можете использовать Boost.Rational для представления своих индексов.

...