Как бы вы установили для переменной максимально возможное число в C?

Упрощенный подход заключается в том, чтобы иметь способ сохранить заголовок.

Допустим, у вас есть файл .csv like:

user, topic, hits
om,  scala, 120
daniel, spark, 80
3754978, spark, 1

Мы можем определить класс заголовка который использует анализируемую версию первой строки:

class SimpleCSVHeader(header:Array[String]) extends Serializable {
  val index = header.zipWithIndex.toMap
  def apply(array:Array[String], key:String):String = array(index(key))
}

Чтобы мы могли использовать этот заголовок для адресации данных дальше по дороге:

val csv = sc.textFile("file.csv")  // original file
val data = csv.map(line => line.split(",").map(elem => elem.trim)) //lines in rows
val header = new SimpleCSVHeader(data.take(1)(0)) // we build our header with the first line
val rows = data.filter(line => header(line,"user") != "user") // filter the header out
val users = rows.map(row => header(row,"user")
val usersByHits = rows.map(row => header(row,"user") -> header(row,"hits").toInt)
...

Обратите внимание, что header не намного больше, чем простое отображение мнемоники на индекс массива. Практически все это можно сделать на порядковом месте элемента в массиве, например user = row(0)

PS: Добро пожаловать в Scala: -)

20
задан David Rodríguez - dribeas 16 February 2010 в 15:43
поделиться

8 ответов

#include <limits.h>
int x = INT_MAX;

РЕДАКТИРОВАТЬ: ответил до того, как спрашивающий пояснил, я просто догадывался, какой тип они хотели.

32
ответ дан 29 November 2019 в 22:29
поделиться

Существует файл с именем limits.h (по крайней мере, в Linux есть), который содержит такое определение, например

/* Maximum value an `unsigned short int' can hold.  (Minimum is 0.)  */
#  define USHRT_MAX 65535

/* Minimum and maximum values a `signed int' can hold.  */
#  define INT_MIN   (-INT_MAX - 1)
#  define INT_MAX   2147483647

/* Maximum value an `unsigned int' can hold.  (Minimum is 0.)  */
#  define UINT_MAX  4294967295U
27
ответ дан 29 November 2019 в 22:29
поделиться

Поскольку в этом вопросе есть тег C ++, я предлагаю numeric_limits:

#include <limits>

unsigned x = std::numeric_limits<unsigned>::max();
4
ответ дан 29 November 2019 в 22:29
поделиться

Безусловно, самый простой способ получить наибольшее значение для целочисленного типа без знака. заключается в приведении (-1) к этому типу. Стандарт (§6.2.5 / 9) требует, чтобы беззнаковые математические вычисления выполнялись по модулю числа, на единицу большего, чем наибольшее значение, которое может быть представлено, поэтому для любого беззнакового типа T выражение ( (T) -1) обязательно будет наибольшим возможным значением в этом типе.

9
ответ дан 29 November 2019 в 22:29
поделиться

Обычно это делается в 1.0/0.0, но вы можете получить предупреждение о компиляции. Я не знаю других переносимых способов сделать это в C89, но в C99 есть макрос FP_INFINITE в math.h.

EDIT: Очевидно, Сэм на самом деле хотел не бесконечность, а целочисленные пределы, которые можно найти в limits.h, как указали другие.

2
ответ дан 29 November 2019 в 22:29
поделиться

Если включить E_NOTICE сообщения об ошибках, PHP расскажет вам о неинициализированных переменных:

ini_set("error_reporting", E_ALL);

Неинициализированные немного отличаются от незаявленных, но должны дать вам аналогичный эффект.

-121--3941945-

Я использовал http://beanstalkapp.com/ и нашел его хорошим для размещения проектов. Вы определенно должны взглянуть на них, если вам действительно нужно придерживаться SVN.

-121--4536286-

На основании ваших комментариев, вы хотите без знака int (хотя вы говорите «без знака целое число», так что, возможно, вы хотите интегральное значение, не обязательно без знака int ).

В C для неподписанного интегрального типа значение -1 при преобразовании в этот тип гарантированно является наибольшим значением этого типа:

size_t size_max = -1;
unsigned int uint_max = -1;
unsigned long ulong_max = -1;

присвойте переменным значения SIZE _ MAX , UINT _ MAX и ULONG _ MAX соответственно. В общем, вы должны включить limits.h и использовать соответствующий макрос, но приятно знать правило выше. Кроме того, SIZE _ MAX не находится в C89, поэтому size _ t size_max = -1; будет работать как в C89, так и в C99.

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

6
ответ дан 29 November 2019 в 22:29
поделиться

Я обычно использую макросы * _MAX из ] limits.h INT_MAX для целых чисел и т. д. Они всегда будут правильно установлены для типа переменной. Даже типы с явно заданным размером, такие как uint32, будут иметь соответствующие записи в этом заголовочном файле.

Это самое большое возможное значение, которое может содержать переменная этого типа.

Для целого числа без знака, как вы просили в своем вопросе, вы должны использовать UINT_MAX

1
ответ дан 29 November 2019 в 22:29
поделиться

Думаю, вы можете проверить эту ссылку:

http://www.gnu.org/s/libc/manual/html_node/ Infinity-and-NaN.html

Я сделал это, и он отлично работает на gcc 4.4.1


#include "math.h"

int main(int argc, char**argv)
{ 
    int x = INFINITY; 
    return 0;
}

1
ответ дан 29 November 2019 в 22:29
поделиться
Другие вопросы по тегам:

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