После присваивания матрица равна нулю. C ++ Armadillo [дубликат]

Не совсем очевидно, почему нужно было бы объединить (десятичные) значения «ascii». Несомненно, что объединение их без ведущих нулей (или какого-либо другого дополнения или разделителя) бесполезно - ничто не может быть надежно восстановлено из такого выхода.

>>> tests = ["hi", "Hi", "HI", '\x0A\x29\x00\x05']
>>> ["".join("%d" % ord(c) for c in s) for s in tests]
['104105', '72105', '7273', '104105']

Обратите внимание, что первые 3 выхода разной длины. Обратите внимание, что четвертый результат совпадает с первым.

>>> ["".join("%03d" % ord(c) for c in s) for s in tests]
['104105', '072105', '072073', '010041000005']
>>> [" ".join("%d" % ord(c) for c in s) for s in tests]
['104 105', '72 105', '72 73', '10 41 0 5']
>>> ["".join("%02x" % ord(c) for c in s) for s in tests]
['6869', '4869', '4849', '0a290005']
>>>

Не замечайте таких проблем.

153
задан Lundin 22 May 2017 в 06:51
поделиться

5 ответов

Будет ли всегда быть пол подразделения? Что такое определенное поведение?

Да, целочисленное частное из двух операндов.

6.5.5 Мультипликативные операторы

6 Когда целые числа делятся, результат оператора / является алгебраическим фактором с любой дробной частью, отброшенной.88) Если фактор a / b является представимым, выражение (a / b) * b + a% b должно быть равно a.

и соответствующая сноска:

88) Это часто называют «усечением к нулю».

Конечно, необходимо отметить два момента: :

3 Обычные арифметические преобразования выполняются в операндах.

и:

5 Результат / operator является частным от деления первого операнда на второй; результатом оператора% является остаток. В обеих операциях, если значение второго операнда равно нулю, поведение не определено.

[Примечание: Акцент мой]

144
ответ дан cmaher 19 August 2018 в 04:40
поделиться
  • 1
  • 2
    Это ни пол, ни потолок, это усечение дробной части, это принципиально другое! – Wizard79 30 August 2010 в 18:48
  • 3
    @W: A: Нет. Он определяется как усечение к нулю. Призыв к чему-нибудь еще, просто добавит к путанице, поэтому, пожалуйста, воздержитесь от этого. – Martin York 30 August 2010 в 18:49
  • 4
  • 5
    @Philip Potter: Я не думаю, что он был определен на C89, и это не в стандарте C ++ 1998 года. В этом, конечно, (a / b) * b + a % b == a должно было быть выполнено, а абсолютное значение a % b должно быть меньше a, но было ли a % b отрицательным для отрицательных a или b не указано. – David Thornley 30 August 2010 в 22:28
37
ответ дан Community 19 August 2018 в 04:40
поделиться

Если результат отрицательный, C усекает в направлении 0, а не настил пола, - я узнал об этом чтении о том, почему Python целое деление всегда здесь: Почему Python Integer Division Floors

18
ответ дан Gareth Williams 19 August 2018 в 04:40
поделиться
  • 1
    Я согласен с комментарием, интересно ли иметь (минус% pos) отрицательное значение когда-либо полезное? Что касается соответствующей заметки, я задаюсь вопросом, требуется ли требуемое арифметически-неправильное поведение в некоторых случаях «unsignedvar & gt; signedvar & Quot; всегда полезно? Я могу понять, почему не требуется всегда правильное поведение; Я не вижу оснований для неправильного поведения. – supercat 30 August 2010 в 19:34
  • 2
    +1 для отличной справки о том, почему напольное покрытие является правильным поведением для целочисленного деления (в отличие от определения C, которое нарушается и почти никогда не бывает полезным). – R.. 30 August 2010 в 20:19
  • 3
    правильно и точно. +1. – Muhammad El Nakeep 6 February 2015 в 10:04
  • 4
  • 5
    @hobbs: Я не думаю, что приведенный выше код будет вести себя чисто, когда сигналы пересекают ноль. Если div является оператором деления пола и factor нечетным, то filtered += (filter+(factor div 2)) div factor даст чистое и симметричное поведение для всех значений до INT_MAX-(factor div 2). – supercat 21 December 2017 в 19:35

Будет ли всегда быть пол деления?

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

Каково заданное поведение?

Чтобы очистить полные раунды к отрицательной бесконечности, в то время как целые деления округляются к нулю (обрезанные)

Для положительных значений они одинаковы

int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0

Для отрицательного значения это отличается

int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
10
ответ дан Muhammad El Nakeep 19 August 2018 в 04:40
поделиться
14
ответ дан Peter Cordes 19 August 2018 в 04:40
поделиться
Другие вопросы по тегам:

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