Вот мое (не самое результативное) решение. Он полагается на то, что преобразование байт / латин-1 без потерь, что не истинно для преобразований байтов / ASCII или байтов / UTF8.
Преимущества в том, что It Works ( tm) для любых байтовых значений (некоторые другие решения работают некорректно с байтами 0x80-0xff) и могут быть расширены для выполнения более расширенного соответствия регулярных выражений.
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
class C {
public static void Main() {
byte[] data = {0, 100, 0, 255, 100, 0, 100, 0, 255};
byte[] pattern = {0, 255};
foreach (int i in FindAll(data, pattern)) {
Console.WriteLine(i);
}
}
public static IEnumerable<int> FindAll(
byte[] haystack,
byte[] needle
) {
// bytes <-> latin-1 conversion is lossless
Encoding latin1 = Encoding.GetEncoding("iso-8859-1");
string sHaystack = latin1.GetString(haystack);
string sNeedle = latin1.GetString(needle);
for (Match m = Regex.Match(sHaystack, Regex.Escape(sNeedle));
m.Success; m = m.NextMatch()) {
yield return m.Index;
}
}
}
Простым способом без использования ieee_arithmatic
является выполнение следующих действий.
Бесконечность: Определите свою переменную infinity = HUGE(dbl_prec_var)
(или, если она у вас есть, переменная точности четности). Затем вы можете просто проверить, не изменилась ли ваша переменная на if(my_var > infinity)
.
NAN: Это еще проще. По определению, NAN не равна ничему, даже самому себе. Просто сравните переменную с самим собой: if(my_var /= my_var)
.
У меня недостаточно комментариев для комментариев, поэтому я буду «отвечать» на предложение Рика Томпсона для тестирования бесконечности.
if (A-1 .eq. A)
Это также верно, если A - очень большое число с плавающей запятой, а 1
ниже точности A.
Простой тест:
subroutine test_inf_1(A)
real, intent(in) :: A
print*, "Test (A-1 == A)"
if (A-1 .eq. A) then
print*, " INFINITY!!!"
else
print*, " NOT infinite"
endif
end subroutine
subroutine test_inf_2(A)
real, intent(in) :: A
print*, "Test (A > HUGE(A))"
if (A > HUGE(A)) then
print*, " INFINITY!!!"
else
print*, " NOT infinite"
endif
end subroutine
program test
real :: A,B
A=10
print*, "A = ",A
call test_inf_1(A)
call test_inf_2(A)
print*, ""
A=1e20
print*, "A = ",A
call test_inf_1(A)
call test_inf_2(A)
print*, ""
B=0.0 ! B is necessary to trick gfortran into compiling this
A=1/B
print*, "A = ",A
call test_inf_1(A)
call test_inf_2(A)
print*, ""
end program test
выходов:
A = 10.0000000
Test (A-1 == A)
NOT infinite
Test (A > HUGE(A))
NOT infinite
A = 1.00000002E+20
Test (A-1 == A)
INFINITY!!!
Test (A > HUGE(A))
NOT infinite
A = Infinity
Test (A-1 == A)
INFINITY!!!
Test (A > HUGE(A))
INFINITY!!!
Нет.
Также не существует стандартного метода проверки бесконечности или NaN в Fortran 90/95, а также не может быть стандартного. Не существует стандартного метода определения любого из этих квазицифровых чисел в Fortran 90/95.
Нет.
Явные части IEEE_ARITHMETIC для генерации / проверки для NaN достаточно просты для записи для gfortran для конкретной архитектуры.
Я использовал:
PROGRAM MYTEST
USE, INTRINSIC :: IEEE_ARITHMETIC, ONLY: IEEE_IS_FINITE
DOUBLE PRECISION :: number, test
number = 'the expression to test'
test = number/number
IF (IEEE_IS_FINITE(test)) THEN
WRITE(*,*) 'We are OK'
ELSE
WRITE(*,*) 'Got a problem'
END IF
WRITE(*,*) number, test
END PROGRAM MYTEST
Это напечатает сообщение «Получил проблему» для числа = 0.0D0, 1.0D0 / 0.0D0, 0.0D0 / 0.0D0, SQRT (-2.0D0), а также для переполнений и недочетов, таких как number = EXP (1.0D800) или number = EXP (-1.0D800). Обратите внимание, что в целом такие вещи, как number = EXP (1.0D-800), просто устанавливают число = 1.0 и выдают предупреждение во время компиляции, но программа будет печатать «Мы в порядке», что я считаю приемлемым.
ПР.
IEEE_ARITHMETIC
недоступен и спрашивает, как это сделать с помощью Fortran 90/95.
– Vladimir F
23 May 2016 в 15:41
ieee_arithmetic
, что ieee_support_datatype(test)
истинно. Если это не так, считать ieee_is_finite(test)
не разрешено.
– francescalus
23 May 2016 в 16:15
IEEE_IS_FINITE()
. Но дело в том, что ОП знает, что он существует, но просит альтернативы.
– Vladimir F
23 May 2016 в 16:33
Для Inf, похоже, работает, что если (A-1. Aq. A) истинно, то A является Inf
INTERFACE
и связав несколько типов, которые вы могли бы использовать, в том жеMODULE PROCEDURE
. – Kyle Kanos 30 June 2013 в 23:06infinity = 1.e100_dp
и все равно получить хороший инструмент проверки бесконечности. Даже при использовании небольших весов (например, 1е-24 м) для описания больших масштабов (например, 1е + 24 м) вы все еще не находите места около 1э100. – Kyle Kanos 30 June 2013 в 23:08isnan
. Ответственность программиста - это заботиться об этом, когда он запрашивает небезопасную быструю математику и все еще хочет обнаружить NaN. – Vladimir F 23 May 2016 в 15:48