c ++ предварительные условия / утверждения

Это не моя домашняя работа — я просто тренируюсь. Кажется, я не могу сосредоточиться на этой концепции утверждений.

1) Determine the pre-condition for x that guarantees the post-condition about y
{ _______ }
if (x > 0)
y = x;
else
y = -x;

{ y >= 0 && |y| == |x| }
2) This code is the same as has been seen before, but the post-condition is different.
Describe why this post-condition is better for verifying the code than just { y >= 0}.

2

Решение

Если вы делаете это, чтобы узнать о программировании, вы можете немного программировать, чтобы помочь вам подтвердить ответ:

#include <iostream>

int abs(int x) { return x >= 0 ? x : -x; }

int main()
{
for (int i = -128; i <= 127; ++i)
{
char x = i;

char y;

if (x > 0)
y = x;
else
y = -x;

if (!(y >= 0 && abs(y) == abs(x)))
std::cout << "failed for " << i << " (y " << (int)y << ")\n";
}
}

Запустив это, вы увидите, если не удастся для x -128 (где y это -128). Это связано с асимметрией в нотации дополнения 2: -128 может быть представлен в 8-битном символе, а 128 — нет (только 127).

Таким образом, для 1 и при условии, что 2 дополняют целые числа, предварительным условием является то, что x не самое низкое представимое значение в вашей битовой ширине. Конечно, в этом вопросе нет ничего такого, что говорит о том, что x и y являются целыми числами, так что все это немного условно.

Если x а также y Если, скажем, с плавающей запятой или с двойными числами, то в нормальных представлениях IEEE есть бит знака, который можно переключать, не затрагивая мантиссу или экспоненту, что позволяет «чистое» изменение знака. Тем не менее, существуют также угловые случаи со значениями «не число» (NaN) и (положительное и минус) бесконечности, которые было бы целесообразно проверить экспериментально и / или путем изучения представлений и поведенческих спецификаций ….

Опишите почему [{y> = 0 && | У | == | x | }] лучше для проверки кода, чем просто {y> = 0}.

Неопределенный вопрос, поскольку у нас нет уверенности в том, чего пытается достичь код, и наши рассуждения об этом основаны на утверждении, что первое постусловие лучше, чем второе. Тем не менее, они ищут ответ типа: первый также обеспечивает абсолютную величину y выживает независимо от изменения знака, сделанного кодом x,

На практике для наших двух целых чисел дополнения величина всегда совпадала впоследствии — это была знаковая часть постусловия, которое отмечало угловой случай. Но по-прежнему обнадеживает то, что вы получили дополнительное представление о том, что ожидается.

2

Другие решения

Я думаю, потому что обычно целочисленный тип может представлять из (-N)> 0> (N-1). То есть, если ваше int является 32-разрядным целым числом со знаком, оно может содержать значение -2147483648, но не значение 2147483648.

{x! = INT_MIN}

1

Работа в обратном направлении от состояния почты. Существует только одна ветвь оператора. Так как оператор if проверяет x> 0, просто посмотрите на 3 случая: x < 0, x == 0, а также x > 0 определить, какие значения х удовлетворяют постусловию.

0

Ответ на это может стать грязным в зависимости от типа для x а также y, Поскольку @PeteFordham указал, что целые числа в дополнении к двум не симметричны, абсолютное значение максимального отрицательного целого не может быть представлено. Если вместо целых x а также y являются float или же double тогда вы должны учитывать, что в формате IEEE ноль может иметь как положительный, так и отрицательный знак.

#include <iostream>
int main() {
double x = 0;
double y = -x;
std::cout << "x=" << x << " y=" << y << std::endl;
}

выход

х = 0 у = -0

0

Если x> 0, y> = 0 всегда выполняется из-за if (x > 0) y = x, Если x == 0, y> = 0 всегда выполняется из-за if ( x > 0) ... else y = -x, Если х < 0, y = -x, поэтому y> = 0 выполняется, если только -x < 0. Таким образом, предварительным условием является {x> = 0 || -x> = 0}. (Единственное значение x, для которого это не так, является значением max neg, которое переполняется.)

{y> = 0 && | У | == | x | } лучше, чем {y> = 0}, потому что последнее верно для всех видов функций, а не только для той, которая находит абсолютное значение x (что, по-видимому, и предназначено для этого кода, хотя вы, кажется, исключили важные части постановка задачи).

0
По вопросам рекламы [email protected]