{"id":1692,"date":"2018-11-29T10:54:31","date_gmt":"2018-11-29T08:54:31","guid":{"rendered":"https:\/\/zen-cori.138-201-132-86.plesk.page\/?p=1692"},"modified":"2022-09-28T10:45:51","modified_gmt":"2022-09-28T08:45:51","slug":"what-you-should-know-about-floating-point","status":"publish","type":"post","link":"https:\/\/www.btc-embedded.com\/de\/what-you-should-know-about-floating-point\/","title":{"rendered":"What you should know about floating-point"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"1692\" class=\"elementor elementor-1692\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3b5f0493 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3b5f0493\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-559a247a\" data-id=\"559a247a\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a1ff07f elementor-widget elementor-widget-text-editor\" data-id=\"a1ff07f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Floating-point code becomes more and more common in today\u2019s automotive industry. Since development is often done model-based using tools such as Simulink and dSPACE TargetLink, the model serves as an additional abstraction layer and therefore is an additional stage in the development and testing process. In comparison to fixed-point, floating-point comes up with several advantages. The biggest advantage, from most developers\u2019 point of view, is to get rid of the scaling task. There is also a better detection of infinite and NaN (not a number), represented by special values. Beyond that, it seems that the precision increases and almost enables to represent the physical behavior (let\u2019s see if that\u2019s true). Finally, the range of representable values is much larger (which also comes with a downside).<\/p>\n<p>So, looking at all the advantages, why not switch everything to floating-point?<\/p>\n<p>Consider the following characteristics, before you decide to use floating-point:<\/p>\n<figure class=\"content-image img_33 img_right\">\n<figcaption><\/figcaption>\n<\/figure>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-da6f93a elementor-widget elementor-widget-heading\" data-id=\"da6f93a\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Accuracy<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fa217fc elementor-widget elementor-widget-text-editor\" data-id=\"fa217fc\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Let\u2019s say there is an unsigned fixed-point integer with a scaling (=resolution) of 0.01. Based on this assumption, the calculation 0.01 + 0.01 will naturally result in exactly 0.02. Assigning the same calculation using floating-point (single precision), 0.01 + 0.01 will result in 0.0199999995529651641845703125. It\u2019s close to 0.02 but not the exact value. If we have a look at the value 0.01, we can see that it is neither represented in an exact way.\u00a0<span style=\"color: var( --e-global-color-text ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-size: var( --e-global-typography-text-font-size ); font-style: var( --e-global-typography-text-font-style ); letter-spacing: var( --e-global-typography-text-letter-spacing ); text-transform: var( --e-global-typography-text-text-transform ); text-decoration: var( --e-global-typography-text-text-decoration ); background-color: var( --e-global-color-8c64e01 );\">This becomes clear if we look how the value 0.01 is really represented in floating-point.\u00a0<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7f170fe elementor-widget elementor-widget-heading\" data-id=\"7f170fe\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Structure of a floating-point variable\u200b<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e7d2418 elementor-widget elementor-widget-text-editor\" data-id=\"e7d2418\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: var( --e-global-color-text ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-size: var( --e-global-typography-text-font-size ); font-style: var( --e-global-typography-text-font-style ); letter-spacing: var( --e-global-typography-text-letter-spacing ); text-transform: var( --e-global-typography-text-text-transform ); text-decoration: var( --e-global-typography-text-text-decoration ); background-color: var( --e-global-color-8c64e01 );\">A floating-point value is made up of 3 elements; 1 bit for the sign, 8 bits for the exponent and 23 bits for the mantissa totaling 32 bits. To represent a certain number, the mantissa represents a certain value with the exponent. In the case of 0.01, it looks like this:<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aadfa40 elementor-widget elementor-widget-image\" data-id=\"aadfa40\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"118\" src=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2018\/11\/Bildschirmfoto-2022-06-16-um-10.56.53.png\" class=\"attachment-large size-large wp-image-1696\" alt=\"Structure of a floating-point code variable\" srcset=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2018\/11\/Bildschirmfoto-2022-06-16-um-10.56.53.png 1802w, https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2018\/11\/Bildschirmfoto-2022-06-16-um-10.56.53-768x113.png 768w, https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2018\/11\/Bildschirmfoto-2022-06-16-um-10.56.53-1536x227.png 1536w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e9bd924 elementor-widget elementor-widget-text-editor\" data-id=\"e9bd924\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>If we calculate 1.2799999713897705 * 2<sup>-7<\/sup>\u00a0it results in 0.00999999977648258209228515625, the closest value in float to 0.01. This relative error due to rounding, is called the machine epsilon.<\/p><p>The first conclusion is, if you need an exact representation of values for things like loop counters or checking values for equality, floating-point code is not the right choice.<\/p><p>Whereas half of the representable values of a float variable range between -1 and 1, accuracy decreases for larger values. With a float (single precision), the number 16.777.217 cannot be represented and depending on the rounding mode of the compiler, instead, this will lead to 16.777.21<b>6<\/b>\u00a0or 16.777.21<b>8<\/b>. For larger numbers, the gap between each representable value is even larger.<\/p><p>To summarize, floating-point variables do not bring more precision compared to fixed point. However, they bring a precision which dynamically changes across the value range; small numbers have high precision, large numbers have less precision. If your variables stay inside a clearly defined value range, similar (or even better) precision is possible with a constant scaling in fixed-point.<\/p><figure class=\"content-image \"><\/figure>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3810d50 elementor-widget elementor-widget-heading\" data-id=\"3810d50\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Comparison<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6bb1d04 elementor-widget elementor-widget-text-editor\" data-id=\"6bb1d04\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Being aware of the discoveries in the previous section, there is also an effect on comparisons. There are different situations, where comparisons are done.<\/p><ul><li>Compare a variable and a constant value<\/li><li>Loop counter<\/li><li>Switch-Case operations<\/li><\/ul><div>\u00a0<\/div><p>In these use cases, an exact comparison is needed, otherwise, this might lead to unintended behavior in the floating-point code. In other use cases like greater\/less comparisons, the floating-point precision can be suitable. However, if an exact and transparent behavior is intended, the inaccuracy might lead to a smaller or greater value than expected as a result of a calculation and therefore the wrong decision is made. For these use cases, the usage of fixed-point is the first choice.<\/p><figure class=\"content-image \"><\/figure>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-620c7ed elementor-widget elementor-widget-heading\" data-id=\"620c7ed\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Influence of the compiler for floating-point code<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5539473 elementor-widget elementor-widget-text-editor\" data-id=\"5539473\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Using floating-point code, the compiler has a much higher impact on the behavior of the code compared to fixed-point. This becomes more important for model-based development, where usually three stages of implementation are taken into account. These are model-in-the-loop (MIL), software-in-the-loop (SIL) and processor-in-the-loop (PIL, target object code). MIL usually represents the values with double precision. Most of the target processors in embedded software are based on 32-bit, so the SIL implementation is typically done in single precision. Based on the data type used, this might lead to different behavior in certain situations on MIL and SIL\/PIL. In addition, there are three main influence factors that you should be aware of:<\/p><figure class=\"content-image \"><\/figure>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cedc61e elementor-widget elementor-widget-heading\" data-id=\"cedc61e\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Precision<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9322b25 elementor-widget elementor-widget-text-editor\" data-id=\"9322b25\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Let\u2019s assume the following code:<\/p><p><b>double<\/b>\u00a0v = 1 x 10<sup>308<\/sup>;<br \/><b>double<\/b>\u00a0x = (v * v) \/ v;\u00a0<\/p><p>The expected result of the second line of code is +\u221e. Even though this might be correct, sometimes the result can be x = v, if the processor is able to internally calculate with 80-bit precision. This can have an effect on development and testing on different implementation levels.<\/p><figure class=\"content-image \"><\/figure>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-32da2e2 elementor-widget elementor-widget-heading\" data-id=\"32da2e2\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Optimization<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3e6276a elementor-widget elementor-widget-text-editor\" data-id=\"3e6276a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Algebraic laws do not hold in general in finite precision arithmetic like<\/p><figure class=\"content-image \"><\/figure>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7f771a2 elementor-widget elementor-widget-image\" data-id=\"7f771a2\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"135\" src=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2018\/11\/Bildschirmfoto-2022-06-16-um-11.00.20.png\" class=\"attachment-large size-large wp-image-1699\" alt=\"Algebraic laws do not hold in floating-point code\" srcset=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2018\/11\/Bildschirmfoto-2022-06-16-um-11.00.20.png 1796w, https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2018\/11\/Bildschirmfoto-2022-06-16-um-11.00.20-768x129.png 768w, https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2018\/11\/Bildschirmfoto-2022-06-16-um-11.00.20-1536x258.png 1536w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ca3c25 elementor-widget elementor-widget-text-editor\" data-id=\"0ca3c25\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Although many compilers give the opportunity to control compiler optimizations, such value-changing compiler optimizations can be enabled by default to improve efficiency and\/or reduce size like for the Intel\u00ae Compiler.<\/p><figure class=\"content-image \"><\/figure>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-81eac94 elementor-widget elementor-widget-heading\" data-id=\"81eac94\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Rounding<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-57ba19c elementor-widget elementor-widget-text-editor\" data-id=\"57ba19c\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>If the number of available digits is not sufficient to represent a real number precisely, rounding is used to represent a close value<\/p><p><b>double<\/b>\u00a0a = 0.1;<br \/><b>double<\/b>\u00a0x = (a * -a) * (a * a);\u00a0<\/p><p>The result for x in the second line of code depends on the used rounding mode:<\/p><figure class=\"content-image \"><\/figure>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3be1b89 elementor-widget elementor-widget-image\" data-id=\"3be1b89\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"141\" src=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2018\/11\/Bildschirmfoto-2022-06-16-um-11.03.53.png\" class=\"attachment-large size-large wp-image-1702\" alt=\"Rounding methods in floating-point code\" srcset=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2018\/11\/Bildschirmfoto-2022-06-16-um-11.03.53.png 1814w, https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2018\/11\/Bildschirmfoto-2022-06-16-um-11.03.53-768x135.png 768w, https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2018\/11\/Bildschirmfoto-2022-06-16-um-11.03.53-1536x271.png 1536w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-829695b elementor-widget elementor-widget-text-editor\" data-id=\"829695b\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>This means that depending on the compiler settings and the capabilities of the underlying CPU, the results of calculations might be different between different compilers and CPUs. This can even lead to slightly different code coverage results between SIL and PIL floating-point code.<\/p><figure class=\"content-image \"><\/figure>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-129c409 elementor-widget elementor-widget-heading\" data-id=\"129c409\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Conclusion<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9da8f13 elementor-widget elementor-widget-text-editor\" data-id=\"9da8f13\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>To answer the question of why not switching everything to floating-point code, there is a wide range of use cases, that will improve and get easier by using floating-point variables. However, there are certain use cases where using floating-point might lead to unintended and untransparent behavior. Furthermore, on different implementation levels like MIL, SIL and PIL the results of floating-point arithmetic might be different due to different compiler settings for precision, optimization and rounding. This makes testing of the target code (PIL) much more important than in fixed-point arithmetic. To deal with these new challenges and to stay ISO 26262 compliant, the test process should consider a structural Back-to-Back test besides the Requirements-based Testing. This should be done between the reference implementation (usually MIL) and the target code (PIL), if available or SIL otherwise.\u00a0<\/p><p>If you want to dive deeper in the topic of floating-point, I can highly recommend the paper <a href=\"https:\/\/arxiv.org\/pdf\/cs\/0701192.pdf\" target=\"_blank\" rel=\"noopener\">The pitfalls of verifying floating-point computations<\/a>\u00a0from David Monniaux.<\/p><p>Please, also have a look at the article of my colleague Markus Gros about <a href=\"https:\/\/www.btc-embedded.com\/what-you-should-know-about-fixed-point\/\">What you should know about fixed-point code<\/a>,\u00a0so to speak the counterpart to floating-point code.<\/p><figure><\/figure>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Floating-point code becomes more and more common in today\u2019s automotive industry. Since development is often done model-based using tools such as Simulink and dSPACE TargetLink, the model serves as an additional abstraction layer and therefore is an additional stage in the development and testing process. In comparison to fixed-point, floating-point comes up with several advantages. [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":11233,"comment_status":"open","ping_status":"closed","sticky":false,"template":"elementor_theme","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[50,49,48,51],"product":[],"use_cases":[],"class_list":["post-1692","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-automatic-code-generation","tag-model-based-development","tag-simulink","tag-targetlink"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/posts\/1692","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/comments?post=1692"}],"version-history":[{"count":0,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/posts\/1692\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/media\/11233"}],"wp:attachment":[{"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/media?parent=1692"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/categories?post=1692"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/tags?post=1692"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/product?post=1692"},{"taxonomy":"use_cases","embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/use_cases?post=1692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}