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

Является ли unsigned char * temp = (unsigned char *) & округлено безопасным или здесь есть неопределенное поведение, и почему?

blockquote>

Это хорошо определено как псевдоним через unsigned char разрешено разрешено .

является ли такая круглая функция безопасной и точной для всех входных данных?

blockquote>

Нет. Вы не можете идеально решить эту проблему с усечением / округлением. Учтите, что одна реализация дает 0x.....0ff, а другая 0x.....100. Установка lsb на 0x00 приведет к тому, что исходная разница в 1 ульп составит 256 ульпов.

Никакой алгоритм округления не может это исправить.

У вас есть два варианта:

  • не использовать с плавающей запятой, используйте другой способ (например, с фиксированной запятой)
  • встроить библиотеку с плавающей запятой в ваше приложение, который использует только базовую арифметику с плавающей запятой (+, -, *, /, sqrt), и не использует -ffast-math, или любую эквивалентную опцию. Таким образом, если вы работаете на платформе, совместимой с IEEE-754, результаты с плавающей запятой должны быть такими же, как в IEEE-754, согласно которым базовые операции должны рассчитываться «идеально». Это означает, что операция рассчитана с бесконечной точностью, а затем округлена до полученного представления.

Кстати, если разница на входе 1e-17 означает огромную разницу на выходе, то ваша проблема / алгоритм плохо обусловлены , чего, как правило, следует избегать, поскольку обычно оно не дает Вы значимые результаты.

6
задан Fabio Gomes 29 October 2008 в 18:35
поделиться

3 ответа

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

MyStringList.Values[Key1] := Value1;
9
ответ дан 8 December 2019 в 18:43
поделиться

Сделайте обертку вокруг своего "значения"

TMyValue = class
  value: String;
end;

Затем используйте это:

myValue := TMyValue.Create;
myValue.Value = Value1;

MyStringList.AddObject(Key1, Value1);

Затем можно отсортировать список, сделать IndexOf (Key1) и получить объект.

Тем путем Ваш список отсортирован, и поиск очень быстр.

4
ответ дан 8 December 2019 в 18:43
поделиться

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

Определите его как это:

type
  TKVEnum = (tKey, tValue); // You could give this a better name
const
  Count = 3;
  KeyValues: array [1..Count, TKVEnum] of string =
    // This is each of your name / value paris
    (('1', 'a'), ('2', 'b'), ('3', 'd'));  

Затем Вы используете его как это:

if MyValue = KeyValues[1, TKVEnum.tKey] then 
  Result := KeyValues[1, TKVEnum.tValue]

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

Вместо того, чтобы определить первый размер численно, я предложил бы

type
  TConstPairs = (tcUsername, tcDatabase, tcEtcetera);

Но я предполагаю, что полностью зависит от того, что Вы представляют константы.

0
ответ дан 8 December 2019 в 18:43
поделиться
Другие вопросы по тегам:

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