1

I am working with yang (RFC 6020). I have a leaf node 'Frequency' in yang. Frequency field is of type decimal64 and fraction-digits are defined as 6 and range from -90.000000 to 90.000000. While trying to validate and save, following happens:

  1. Number with 6 decimals gets saved eg. 34.000001
  2. Number with no decimals gets saved eg. 34

But when I try to save number with decimal value less then 6 digits, it doesn't get saved. It gives following error: eg.

  • 34.1: "wrong fraction-digits 1 for type decimal64"
  • 34.001 : "wrong fraction-digits 3 for type decimal64"
  • 34.00001 : "wrong fraction-digits 5 for type decimal64"

Tried to search on net. Not much document is available on this. Tried playing around with range parameter but it does not work.

leaf Frequency {
    description "Frequency";
    type decimal64 {
        fraction-digits 6;
        range "-90.000000..90.000000";
    }
    default 0;
}

I expect to be able to save values with/without decimal values where no of decimal values can vary from 0 to 6 digits. eg. 34, 34.1, 34.0004, 34.000001 etc

Rahil Khan
  • 13
  • 4

1 Answers1

1

The value space for a decimal64 YANG type value with fraction-digits set to 6 are real numbers in the following range: -9223372036854.775808..9223372036854.775807. 34, 34.1, 34.001, 34.004, 34.00001 are all within this range and therefore valid values.

This is what the RFC says about decimal64 built-in type (RFC6020, Section 9.3, p1):

The decimal64 type represents a subset of the real numbers, which can be represented by decimal numerals. The value space of decimal64 is the set of numbers that can be obtained by multiplying a 64-bit signed integer by a negative power of ten, i.e., expressible as "i x 10^-n" where i is an integer64 and n is an integer between 1 and 18, inclusively.

So basically, d x 10^f, where d is a decimal64 value and f is fraction-digits, must result in a valid int64 value, which ranges from -9223372036854775808 to 9223372036854775807, inclusively.

Here is how fraction-digits is defined (RFC6020, Section 9.3.4, p1):

The "fraction-digits" statement, which is a substatement to the "type" statement, MUST be present if the type is "decimal64". It takes as an argument an integer between 1 and 18, inclusively. It controls the size of the minimum difference between values of a decimal64 type, by restricting the value space to numbers that are expressible as "i x 10^-n" where n is the fraction-digits argument.

The following table lists the minimum and maximum value for each fraction-digit value:

+----------------+-----------------------+----------------------+
| fraction-digit | min                   | max                  |
+----------------+-----------------------+----------------------+
| 1              | -922337203685477580.8 | 922337203685477580.7 |
| 2              | -92233720368547758.08 | 92233720368547758.07 |
| 3              | -9223372036854775.808 | 9223372036854775.807 |
| 4              | -922337203685477.5808 | 922337203685477.5807 |
| 5              | -92233720368547.75808 | 92233720368547.75807 |
| 6              | -9223372036854.775808 | 9223372036854.775807 |
| 7              | -922337203685.4775808 | 922337203685.4775807 |
| 8              | -92233720368.54775808 | 92233720368.54775807 |
| 9              | -9223372036.854775808 | 9223372036.854775807 |
| 10             | -922337203.6854775808 | 922337203.6854775807 |
| 11             | -92233720.36854775808 | 92233720.36854775807 |
| 12             | -9223372.036854775808 | 9223372.036854775807 |
| 13             | -922337.2036854775808 | 922337.2036854775807 |
| 14             | -92233.72036854775808 | 92233.72036854775807 |
| 15             | -9223.372036854775808 | 9223.372036854775807 |
| 16             | -922.3372036854775808 | 922.3372036854775807 |
| 17             | -92.23372036854775808 | 92.23372036854775807 |
| 18             | -9.223372036854775808 | 9.223372036854775807 |
+----------------+-----------------------+----------------------+

The tool you are using is wrong. The following is valid YANG:

  typedef foobar {
    type decimal64 {
      fraction-digits 6;
      range "-90.000000..90.000000";
    }
    default 34.00001;
  }

YANG 1.1 (RFC7950) did not change this aspect of the language (the same applies).

Community
  • 1
  • 1
predi
  • 5,528
  • 32
  • 60