mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-25 20:45:35 -04:00
57 lines
1.6 KiB
C
57 lines
1.6 KiB
C
#include <stdlib.h>
|
|
|
|
//! Convert string representation of a floating point number into a double
|
|
//
|
|
//! This function handles converting floating point numbers from an ENDF 11
|
|
//! character field into a double, covering all the corner cases. Floating point
|
|
//! numbers are allowed to contain whitespace (which is ignored). Also, in
|
|
//! exponential notation, it allows the 'e' to be omitted. A field containing
|
|
//! only whitespace is to be interpreted as a zero.
|
|
//
|
|
//! \param buffer character input from an ENDF file
|
|
//! \param n Length of character input
|
|
//! \return Floating point number
|
|
|
|
double cfloat_endf(const char* buffer, int n)
|
|
{
|
|
char arr[12]; // 11 characters plus a null terminator
|
|
int j = 0; // current position in arr
|
|
int found_significand = 0;
|
|
int found_exponent = 0;
|
|
|
|
// limit n to 11 characters
|
|
n = n > 11 ? 11 : n;
|
|
|
|
int i;
|
|
for (i = 0; i < n; ++i) {
|
|
char c = buffer[i];
|
|
|
|
// Skip whitespace characters
|
|
if (c == ' ') continue;
|
|
|
|
if (found_significand) {
|
|
if (!found_exponent) {
|
|
if (c == '+' || c == '-') {
|
|
// In the case that we encounter +/- and we haven't yet encountered
|
|
// e/E, we manually add it
|
|
arr[j++] = 'e';
|
|
found_exponent = 1;
|
|
|
|
} else if (c == 'e' || c == 'E' || c == 'd' || c == 'D') {
|
|
arr[j++] = 'e';
|
|
found_exponent = 1;
|
|
continue;
|
|
}
|
|
}
|
|
} else if (c == '.' || (c >= '0' && c <= '9')) {
|
|
found_significand = 1;
|
|
}
|
|
|
|
// Copy character
|
|
arr[j++] = c;
|
|
}
|
|
|
|
// Done copying. Add null terminator and convert to double
|
|
arr[j] = '\0';
|
|
return atof(arr);
|
|
}
|